KarmaSphereでおじさんにもMapReduce(Java)できた
ここ数年Javaからは遠ざかっていた。理由は色々だけど、なんか面倒くさいとか、あの辺が面倒だなとか、annotationsがなんか不気味で面倒っぽいなとか、まあそういうことで。あとコンパイルしてjar作ってとか。なんか昔その物じゃないですか。あ、エディタはフルスクリーンなの? カード穿孔機は不要なの? そりゃすごい。
そういうこともあって最近遊んでいるMapReduceはPythonでストリーミングのを書くことでほぼ用は足りているのだけど、この先もしかしたらJavaでしか実現できない状況に追い込まれるかもしれん。それをガリガリとコードで書くのかPigとやらで実現しちゃうのかはわからんが、でもまあ原理を突き詰めるためにコードで苦労しておくのは損はないかな、と。その場合はJavaですよやっぱ。でもね、Javaって面倒じゃないですか。あの辺とかその辺とか。
そんな自分の脳裏にKarmaSphereという製品名は残っていたわけです。先月参加したHadoop Summitに出展していたし。ボーイ・ジョージかよ、みたいな女装した兄ちゃんがコテコテ英語訛りで製品を説明していた。それを今日ダウンロードして使ってみた。
Community Versionは無料。ただし利用にあたってはメールアドレスをKarmaSphereに教える必要がある。Activationのための鍵がメールで送られてくるから。ダウンロードはEclipse用とNetbeans用の二種類があるけど間違える人はいないでしょ。
- ダウンロード(に必要な手続き)はこちらから→http://karmasphere.com/Download/download.html?Submit=Download+Now
自分はEclipse用を選択。ダウンロード先のURLを教えてもらえるので、そいつをEclipseに入れて待つこと5分。あっさりと設置は終わる。再起動してHadoop Perspectiveを選ぶと、Activation Keyをいれろと言ってくるのでその指示に従う。
Activationが終わったら、Java MapReduceアプリケーションをローカルで開発する準備はほぼ整ってしまう。
プロジェクトは通常のJavaアプリとなる。ここではMyHadoopProjectという名称にした。
ライブラリにHadoop Client(Karmasphere)とHadoop MapReduceを加えておくように。
次にMapReduce Jobを定義していく。File->New->Other...でHadoop MapReduce Job(Karmasphere API)を選択。
すると、MyHadoopJob.javaと同時に、MyHadoopJob.workflowというファイルが生成される。
こいつを開くと...Eclipse上に巨大な表がでてくる。表にはタブがあって、順番にBootsrap, Input, Mapper, Partitioner, Comparator, Combiner, Reducer, Outputとなっている。このそれぞれのタブで必要なクラスや値を定義することで、MapReduceの実装をしてしまおう、というのがKarmaSphereだ。
まずはBootstrap。ここでは入力ファイルを与える。自分は英語のニュースサイトから持ってきたテキストファイルを指定した。
次にInput。既定値に入っているorg.apache.hadoop.mapred.TextInputFormatのままでよい。下の方にTextInputFormatが処理した結果が表示されている。処理過程を確認しながら実装できるのが嬉しいねぇ。
次はMapper定義。単語数える時の定番TokenCountMapperを指定。他のクラスを指定すると、下のデータ表示がいろいろ変わるから試してみよう。なお、画面下の方にあるConfigurationの中にあるAutodetect typesをOnにしておくと、出力のクラスをそれなりに自動設定してくれる。便利。
次がPartitioner定義。デフォルトのHashPartitionerでよかろう。後続のReducerタブ配下にあるReducer数を変更することで、Mapper出力がどんな感じに「散るか」を観察できる。Netbeans版だと、ここは分散具合が集計されて表示されるのだけどEclipse版は人間が数えないといけないらしい。不便。
次のComparatorは単語数える処理ではデフォルトのorg.apache.hadoop.io.Text.Comparator (org.apache.hadoop.io.Text$Comparator)でよし。
その次のCombinerも単語数える処理では不要。
最後に指定するのがReducer。LongSumReducerでよかろう。
感想
ということで、一行もJavaコードを書かないでMapReduceの定番「単語数えプログラム」を実装できた。あともう一点特筆したいのは、Hadoop環境がなくてもプログラムの開発ができる、ということ。EclipseないしはNetbeansさえあればよい、というのは嬉しい。HadoopもClouderaとか使えば導入はそれほど面倒でもないようだけど、開発端末に入れるのもなんだかねぇ。
ここでは机上確認までしかしていないけど、Amazon MapReduceや自前で用意したHadoop環境にも容易にデプロイできるらしい。このお気軽さがあれば、JavaでMapReduce書いてもいいかな。正直、今回の程度の処理ならストリーミングで充分なわけだけど。