ワードカウントのサンプルとHadoopコードリーディング
社内失業もとい社内警備中にHadoopの素振りをしていました。休みたっぷりのGWとか自宅警備中にやればよかったんでしょうが、ヒマならヒマでやらないもんです。はい。忙しくてもやらないですけどw
金払って勉強するのは学生までで社会人たるもの金もらって勉強するものですよね。キリ!
というわけで会社行ってHadoopやHadoop徹底入門を見たりして素振りしてました。ちなみにこの2冊は自腹で買いました。キリ!
で、とりあえずワードカウントのサンプルをgithubに上げました。githubにコードさらしてないとオサレな会社に転職できない時代ですもんね!
https://github.com/wyukawa/hadoop-sample
象本ベースでやってみたので使っているAPIは古いです。パッケージでいうとorg.apache.hadoop.mapredを使いました。mockito使ってテストも書いてます。
要は象本のサンプルソースをワードカウントに書き換えてみたというだけです。はい。これでシャレオツな会社に転職できたら苦労しませんねw
Hadoopのコードも少し読んだのでメモっときます。バージョンは0.20.2です。
1. bin/hadoop jarでジョブをサブミットした場合、該当のjarはhadoop.tmp.dirに展開される。
ソースで言うとorg.apache.hadoop.util.RunJarです。jar内のlibフォルダ内のファイルやclassesフォルダもクラスパスに追加されます。
ちなみにClouderaのVMのHueでジョブをサブミットするとPermission deniedになるのはこのことが関係しています。詳しくはGoogle グループに書かれています。要はhadoop.tmp.dirに書き込み権限が無いのでjarを展開できないということですね。
2. ローカルモードでジョブを実行する処理はLocalJobRunner見ればいい。
擬似分散だとJobTrackerです。JobSubmissionProtocolという共通のインターフェースがあります。擬似分散だとJobClientで動的プロキシを使ってJobSubmissionProtocolのインスタンスを作ります。ゆとりにはキモイですねw
3.ジョブ実行はスレッド全開な感じ
TaskTrackerのinitializeでMap,ReduceのTaskLauncherをstartします。で、TaskRunnerが来てJvmRunnerが来てようやくChildが起動します。全般的にスレッド全開な感じです。ゆとりにはキビシイですねw
4.擬似分散だとPathの起点が/userでべた書き
DistributedFileSystemのgetHomeDirectory見ればわかります。ローカルモードで使うRawLocalFileSystemだとSystem.getProperty("user.dir")してるのになんでだろ。