2013年1月31日木曜日

Hadoopのタスクを任意の数のMapperで起動する


Hadoopを試してみて気づいたのが,やはり巨大ファイルに対しては効率が良いが,
若干処理が重いものを分散して行おうとすると全然ダメと言うこと.

設計思想を考えれば当たり前なんだけど,個人的には便利な分散処理システムとして使いたい.
具体的には,パラメータ設定を変えたシミュレーションを複数同時に走らせたい.

というわけで,かなり無理矢理にシミュレーションをHadoop上で走らせてみた.
やり方としては,
  1. シミュレーションの設定ファイルをDFS上に書き出す
  2. 設定ファイルを読み込んで,対応するシミュレーションを動かす
という処理をやってみた.

ちなみに,ファイル書き出しはこんな感じ


Configuration conf = new Configuration();
Path hdfsPath = new Path(filePath);
FileSystem fs = hdfsPath.getFileSystem(conf);
OutputStream os = fs.create(hdfsPath);
//パラメータファイルは一時ファイルとして,終了と同時に削除する
fs.deleteOnExit(hdfsPath);

OutputStreamWriter osw = new OutputStreamWriter(os);
for(String param:paramList){
 osw.append(param);
 osw.append("\n");
}
osw.flush();
os.close();




すると,

Kind% CompleteNum TasksPendingRunningCompleteKilledFailed/Killed
Task Attempts
map100.00%
100100 / 0
reduce100.00%
100100 / 0

こんな感じで,Mapが一つとか二つでしか起動してくれない.
これは,Hadoopがファイルを「適切な」大きさに直してしまうからである.
設定ファイルなんてたいした大きさじゃないから,どうしても2つくらいにしか分割してくれないわけだ.

というわけで,無理矢理ファイルの区切り位置を変えることで,好きな数のMapを走らせるようにしてみよう.

 

Configuration conf = new Configuration();
conf.setClass("ClassName", class, Scenario.class);
Job job = new Job(conf, "JobName");

//入力ファイルのPathを取得する
Path inputPath = new Path(inputFile.getAbsolutePath()); 
//対象ファイルサイズを取得
long length = inputPath.getFileSystem(conf).getFileStatus(inputPath).getLen(); 
//mapTaskNumは分割したいMap数.これで,1タスクあたりのファイルの区切りサイズを決定する
long splitSize = length/mapTaskNum; 
//最大でもそのサイズ以上にはならないようにタスクを区切る
FileInputFormat.setMaxInputSplitSize(job, splitSize); 


これを,job実行前に行っておけばよい.
これで,任意の数でMapを起動できる.



Kind% CompleteNum TasksPendingRunningCompleteKilledFailed/Killed
Task Attempts
map100.00%
300000300000 / 11
reduce100.00%
100100 / 0



分散し過ぎたw



2013年1月9日水曜日

Windows7にHadoop

Hadoopプログラミングをする上で,いちいちサーバにjarを持って行ってテストをするのは大変すぎるので,Windows上のEclipseでHadoopプログラムをデバッグすることを目指す.

インストール

まず,
https://ccp.cloudera.com/display/SUPPORT/CDH+Downloads
で,CDH3のtarを取得.
CDH3なのはサーバとバージョンを併せるため.

とりあえず,
Hadoop-0.20.2+923.421
をダウンロード.
Cygwinの/usr/local/libに展開.

$ cd /usr/local/lib
$ tar zxvf hadoop-0.20.2-cdh3u5.tar.gz
$ ln -s /cygdrive/c/Program\ Files\ \(x86\)/Java/jdk1.7.0_07/ jdk1.7
$ ln -s jdk1.7 java

Windowsの環境変数にHADOOP_HOMEを追加. Pathも追加.
HADOOP_HOME:C:\usr\cygwin\usr\local\lib\hadoop-0.20.2-cdh3u5
PATH:...;%HADOOP_HOME%\bin

hadoop/bin/hadoop-config.shに以下を追記
# the root of the Hadoop installation
if [ -z "$HADOOP_HOME" ]; then
  export HADOOP_HOME=`dirname "$this"`/..
else
  export HADOOP_HOME=$(cygpath -u "$HADOOP_HOME")
fi
hadoop-env.shにも以下を追記.
# The java implementation to use.  Required.
export JAVA_HOME=/usr/local/lib/java

Windowsではローカルモードでしか起動しないので,以下のように設定する.
conf/core-site.xml
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>C:\tmp\hadoop</value>
    </property>
</configuration>
conf/mapred-site.xml
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>local</value>
    </property>
</configuration>

Eclipseプラグイン

次に,Eclipseにプラグインを入れる. ここで,CDH3のHadoopにはEclipseのプラグインがないので,別途 hadoop-0.20.2.tar.gzをDLしてきて,
hadoop-0.20.2\contrib\eclipse-plugin\hadoop-0.20.2-eclipse-plugin.jar
をEclipseのpluginsにコピーする.

テスト

このページを参考に,
http://www.ne.jp/asahi/hishidama/home/tech/apache/hadoop/tutorial.html
WrodCounterをコピペ.
さらに,Starterとして以下を作成.inputFile.datには適当な文を入れておく.

public class Starter {
 static public void main(String[] args) throws Exception{
  WordCount.main(new String[]{"inputFile.dat", "output"});
 }
}

ここで,chmodがないよ,と怒られるので,Pathに以下を追加
Path ~;C:\usr\cygwin\bin
inputFile.dat
Hello World!
Hello Hadoop!
output/part-r-00000
Hadoop! 1
Hello 2
World! 1
無事成功.

2012年12月10日月曜日

東日本大震災時にデマはリツイートされたのか?

先日J-WAVEのJam the worldという番組に出て,Twitter上のデマについて話をしてきました. その際に,「案外デマはリツイートされなかったんですよ」という話をしたところ,パーソナリティの竹田さんに「そんなことないでしょう」と言われてしまいました.

確かに,これだけTwitter上ではデマが多い,問題だと言われている中でそんなこと言っても信じてもらえないのは無理もない. というわけで,ちゃんとデータで示してみます. 

我々の収集した東日本大震災時のTwitterのデータの中から,3月11日~3月17日に投稿されたツイートのうち,1000件以上リツイートされたものを取り出して,その中身がデマかどうかを確認します. ちなみに,確認の方法は目視.いわゆる「根性マイニング」です.
データは全部で1983ツイートありました. さて,この中で明らかなデマはいくつあったでしょうか.

実は正解は12ツイートです.つまり,全体の1%にも満たない訳ですね.
もちろん,1000リツイート以下のツイートにはもっとデマが含まれていたツイートもあるでしょうが, 大規模に広がったツイートの中にはほとんどデマはなかったということです.

その12ツイートの内容は,
  • 災害対策予備費が削減されていた
  • 自衛隊機は支援物資の空中投下ができない
  • 築地市場では魚が余っている
  • 枝野官房長官が105時間ぶりに寝た
  • 携帯の0か#を長押しすると防犯ブザーが鳴る
  • 政治家等の動向
  • コスモ石油の火災で有毒ガスが発生
  • 千葉製鉄所で爆発
です.最初の二つについては,正確なところは私もよく分かっていないのですが,どうもデマのようです.デマじゃないとしたら,デマの数は計9ツイートになります.
ちなみに,コスモ石油のツイートが1357リツイート,一番リツイートが多かった災害対策予備費の件が2ツイートあり,合計11062リツイートです.
2000近くのツイートを確認しましたが,デマを否定するツイートは多く存在していたが,そのデマ自体はそれほど多くリツイートされなかったという現状が見えてきます.

ちなみに,震災期間中に最も多くリツイートされたのは,こちらのツイートです.
知り合いの福島の方が、「被ばくで怖いのは、健康被害じゃなくて、差別」と仰っています。彼女は現在も福島にいます。どうか「自分は差別しない!」と胸を張って言って下さる方、RTを下さい。偽善でも、その数を見せて差し上げたいんです。
当時で2万リツイート超.2012年12月現在では5万回もリツイートされています. 皆さん覚えていましたか?

ちなみに,これ以外に多かったのが都内での買いだめへの警告です.
買いだめをやめよう,買いだめするこんな恥ずかしい人を見かけた,ウエシマ作戦(どうぞどうぞと譲り合う)などが,当時大量にRTされていたようでした.皆さん覚えていましたか?私は忘れていました.
当時大部分を占めていたはずの内容を忘れて,デマがあったことだけを覚えているというのは,Twitter上でデマが出回ったぞという情報が多く存在したためかもしれません. 人間の記憶なんてその程度の曖昧な者である,ということかもしれませんね.
ちなみに,2012年12月7日に発生した地震で,Twitter上に「家に押しつぶされた」とツイートした高校生がいて「やっぱりツイッターはデマばっかりだ」という印象を持った人も多いかもしれません. でも,それ以外にデマはあったんでしょうか?少なくとも私が見た限りでは発見できませんでした.


ツイッターはデマが多いメディアなのか,それとも,そう思い込んでいるだけなのか.
データを分析すると見えてくる真実は多いです.
ツイッターを「デマ発生器だ」などと揶揄せずに,情報拡散に役立つソーシャルメディアとしての側面をクローズアップして,今後も発生するであろう震災に向けて,よりよい使いかたを模索していきたいものです.


そんな震災時のソーシャルメディアの利用に興味のある研究者はこちらまで.
ソーシャルメディアの基本特性をデータやモデルから明らかにしたい学生の皆様はこちらまで
ご連絡を.

2012年11月26日月曜日

BibtexのAuthorをそのまま出したい

今書いている論文で,日本の情報通信白書をReferしようとしたんだけど, 英語で書くと著者がMinistry of Internal Affairs and Communications, Japanとなる. 普通に書くと
@Book{internal12:_white_paper_infor_commun_japan,
  author =       {Ministry of Internal Affairs and Communications, Japan},
  title =        {WHITE PAPER Information and Communications in Japan},
  publisher =    {Japanese Government},
  year =         2012
}
これをBibtexのauthorに書いてコンパイルすると, 「M. of Internal Affairs and J.Communications」 となってしまう. で,書いたままで出したければどうすればいいかというと,
@Book{internal12:_white_paper_infor_commun_japan,
  author =       {{Ministry of Internal Affairs and Communications, Japan}},
  title =        {WHITE PAPER Information and Communications in Japan},
  publisher =    {Japanese Government},
  year =         2012
}
と{{}}で囲めばいいらしい. Bibtexで書くとき,名前を省略されたくなければ {{と}}で囲めばいいというTIPSでした. これって常識だった?

2012年11月25日日曜日

Androidプログラミング事始め

Nexus7を買ったので,Androidのプログラミングをしてみたくなったのでやってみた. まずは,SDKのダウンロード. http://developer.android.com/sdk/index.htmlでSDKをゲット. Windows用の32bit版のzipをダウンロードして解凍. 中に /eclipse /sdk があるので,このeclipseを使うととりあえず楽ちん. eclipseを立ち上げるとSDKの場所を聞かれるので,それを指定. その後,新規作成でとりあえずAndroidProjectを作成. まずはHelloWorld. この辺は適当にWEBページを探す. 普通にやろうとすると,なぞのエラーで立ち上がらない.
Starting emulator for AVD 'AVD_for_Nexus_7'
emulator: device fd:580
HAX is working and emulator runs in fast virt mode
Failed to allocate memory: 8
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
とかエラーメッセージが出てくる. 実行Windowのターゲット⇒マネージャで Android仮装デバイスマネージャーを立ち上げて, 使うAVDを指定.
指定されていなかったら,DeviceDefinitionsでNexus7を選択すればいいや. で,編集でAndroid仮想デバイスの編集Windowが出るので, MenoryOptionを512にする. デフォルトが1024とかだけど,512にする. 少ないほうのがいいのかよ!とか突っ込みたくなるけど,512にするとうまく起動する.
Androidの立ち上がりが遅い. Androidのエミュレータが遅いのはデフォらしいけど,それにしても遅すぎる. http://tatete.blogspot.jp/2012/03/android.html で,Snapshotというのを試してみるけど,早くならない. 正解は, sdk/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHaxm.exe を実行して,HAXというのをインストールして, sdk/tools/lib/SDK Manager.exe を sdk/ にコピーしてから実行して,
Android 2.3.3(API10)の -Intel Atom x86 System Image Extrasの -Intel x86 Emulator Accelerator(HAXM) をインストールする.
最後に,またAVD仮想デバイスの設定を立ち上げて, ターゲットを Intel Atom x86 System Image(Intel corporation) - API Level 10 - にすると多少早くなるようだ.
ただし,Androidのバージョンとしては2.3.3しか動かないみたいだけど. これだけやって,ようやくHelloWorldがまっとうに表示された.
先が思いやられるなあ.

2012年11月2日金曜日

cytoscapeでネットワーク

ネットワーク描画ツールとして有名なものにcytoscapeがある. 簡単にネットワークを描画できるので重宝しているが, 巨大なネットワークを描画するにはメモリが必要. でもデフォルトでは800Mくらいしかメモリを確保せずに起動するので,設定を変更したい. cytoscape2.8.3をWindows7で動かす場合には,
path_to_programfiles/Cytoscape_v2.8.3/Cytoscape.vmoptions
を変更すれば良い. たとえば,最大メモリ4G使いたいのであれば,
-Xms10m
-Xmx4G
-Xss10m
-Dswing.aatext=true
-Dawt.useSystemAAFontSettings=lcd
と直して起動すれば,最大で4Gほどのメモリを確保して起動してくれる. 便利.

2012年7月11日水曜日

Ruby on Railsをさくらレンタルサーバにインストール・・・ができないことが判明した件

最初に結論から書くと,さくらのレンタルサーバにrailsをインストールするのは難しいようだ.
数年前まではいけたっぽいけど,今は無理みたい.





学会ページ作成のために,さくらレンタルサーバにRailsを導入して,Railsの勉強をしてみる.
基本的な手順は以下の通り.

  1. RubyGemsをインストール
  2. gemを使ってrailsをインストール

ただし,レンタルサーバなのでローカルに入れなければ行けない.
とりあえず,インストール場所は
~/local/bin

~/local/lib

以下にしてみる.
というわけで,以下手順.

RubyGemsをインストール

http://rubyforge.org/frs/?group_id=126
で最新版を探してダウンロード
$ cd
$ mkdir src
$ cd src
$ wget http://rubyforge.org/frs/download.php/76073/rubygems-1.8.24.tgz

インストールする場所を作成
$ mkdir local

$ tar zxvf rubygems-1.8.24.tgz
$ ruby setup.rb --prefix=$HOME/local/
RubyGems 1.8.24 installed



== 1.8.24 / 2012-04-27



* 1 bug fix:



  * Install the .pem files properly. Fixes #320

  * Remove OpenSSL dependency from the http code path





------------------------------------------------------------------------------



RubyGems installed the following executables:

        /home/name/local/bin/gem18

$ cd
$ emacs .cshrc
...

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/\

bin $HOME/local/bin)

setenv RUBYLIB $HOME/local/lib

setenv GEM_HOME $HOME/local/lib/ruby/gem

$ sources .cshrc
$ gem --version
1.8.24

Railsをインストール

$ gem18 install rails --include-dependencies
chown/chgrp: Operation not permitted
エラーだ.
解決策はこちら
http://playet.jugem.jp/?eid=56

$ setenv RB_USER_INSTALL true
$ gem18 install rails --include-dependencies

成功したように見えるのに,なぜかrailsが入っていない.
おや?
Pathに
$HOME/local/lib/ruby/gem/bin
が必要だった.
.cshrcに追加
...

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/bin $HOME/local/lib/ruby/gem/bin)

$ source .cshrc
$ rails -v
Rails 3.2.6
お~.できたできた.

それじゃ,早速アプリケーションを作成してみましょうかね.

$ cd
$mkdir Rails
$ rails new HelloWolrd
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby18 extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby18
        --with-sqlite3-dir
        --without-sqlite3-dir
        --with-sqlite3-include
        --without-sqlite3-include=${sqlite3-dir}/include
        --with-sqlite3-lib
        --without-sqlite3-lib=${sqlite3-dir}/lib
        --enable-local
        --disable-local


Gem files will remain installed in /home/name/local/lib/ruby/gem/gems/sqlite3-1.3.6 for inspection.
Results logged to /home/name/local/lib/ruby/gem/gems/sqlite3-1.3.6/ext/sqlite3/gem_make.out
An error occured while installing sqlite3 (1.3.6), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.6'` succeeds before bundling.
おや?
続けていくと,次々怒られるので,順番にgemでインストールしていって見る.
$ gem18 install coffee-script
$ gem18 install coffee-rails
$ gem18 install sass
$ gem18 install sass-rails
$ gem18 install sqlite3

ここまで順調だったが,ここで問題発生.
Make sure that `gem install sqlite3 -v '1.3.6'` succeeds before bundling.

だけど,さくらに入っているのはsqlite3 ver 3.7.9 20
とりあえず古いバージョンをインストールしてみる.
$ gem install sqlite3-ruby --version=1.2.4
$ rails new HelloWorld
...
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
        /usr/local/bin/ruby18 extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.


Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby18
        --with-sqlite3-dir
        --without-sqlite3-dir
        --with-sqlite3-include
        --without-sqlite3-include=${sqlite3-dir}/include
        --with-sqlite3-lib
        --without-sqlite3-lib=${sqlite3-dir}/lib
        --enable-local
        --disable-local


Gem files will remain installed in /home/name/local/lib/ruby/gem/gems/sqlite3-1.3.6 for inspection.
Results logged to /home/name/local/lib/ruby/gem/gems/sqlite3-1.3.6/ext/sqlite3/gem_make.out
An error occured while installing sqlite3 (1.3.6), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.6'` succeeds before bundling.
調べてみると,結構インストールのやり方が出てくるけど,皆情報が古い.
ここ1年で検索してみると,
http://okwave.jp/qa/q5323794.html
http://d.hatena.ne.jp/ar_tama/20120212/1329027876
を見る限り無理っぽい
なんてこったい.