HadoopでのMapReduce実行方法

HadoopでのMapReduce実行方法は以下の5つあるだろう。

  1. Javaでごりごり実装
  2. Asakusaつかって実装
  3. Hadoopストリーミングを使って実装
  4. Pig使う
  5. Hive使う

僕自身はもっぱらHiveだ。
Asakusaは全然わからないのでここでは触れないが、それ以外は象本読んで何となく雰囲気はつかめた。

分類的に言うとPigとHiveは手続き的、宣言的という違いはあるがDSLという意味では同じようなものなのでここではあまり触れない。

まずJavaでごりごり実装する場合だがこれはなかなか大変だ。

とくに結合が大変。結合がどんな感じかは象本の8章に書いてある。

それ以外の資料としては以前@n3104さんが

5月11日 DevLOVE 黄色い象使いが、獄長に出会うまで。〜象、邂逅編〜(東京都)で説明している資料とサンプルコードが良い題材になるだろう。セカンダリソートやmap side join, reduce side joinもある。

資料

サンプルコード

http://code.google.com/p/try-hadoop-mapreduce-java/

次にHadoopストリーミングだがこれが使われるケースを想定すると下記のような感じかなあと思っている。ちなみに僕自身は仕事で使ったことはない。

  1. Java以外に得意な言語がある。例:Ruby, Perl, Pythonなど
  2. 集約、結合が無い
  3. 手軽に実行したい

こういうケースがどれぐらいあるのか疑問だったけれど、結構あるようだ。

またログ解析しててログはJSONのお化けみたいになってるとかそういう複雑なparse処理がある場合なんかはそれがやりやすい言語でないとしんどいらしい。

あと結合はやっぱり大変なのだが、セカンダリソートはドライバが用意されているのでまだ良い。

ただ一方でその言語のバージョンとかライブラリをちゃんと管理しないと大変そうな気はする。

例えば、このgem使いてーとかなったら全ノードにインストールでしょ。ちょっと躊躇するよね。

ただHiveでもUDFをいっぱい使ってたらHadoopストリーミングと変わんなくねっていうツッコミもある。

やっぱりケースバイケースという結論かな