Hadoopアドベントカレンダー2012 #hadoopAC12jpの21日目です。
今までHadoop関連のツール・フレームワークが出る度に、それで作ったアプリケーションの実行時間を計ってきたので、AZAREA-Cluster Frameworkでも計ってみました。
(あ、ついでにAsakusa Frameworkも0.2のbatchapp版で古かったので、0.4のDirect I/O版に修正しました)
まずはWordCount。
AZAREAはけっこう速いです。
素のMapReduce(Java)とC言語によるストリーミング(とCacading)が一番速いのですが、それに次ぐ順位に来ました。
Combinerは使ってなさそうなのに効率が良いのは、Hiveの様に何か特別な処理をしているのかもしれません。
次は1つの入力から4種類の集計を行うアプリ。
ところが、これは落ちましたorz
最適化を行って3つのMapReduceジョブに集約されているのですが、落ちたのは1つ目です。
スタンドアローンモードで動かすと「Unexpected key」というエラーで、分散環境ではOutOfMemoryErrorでした。
スタンドアローンモードと同じデータをシミュレーターで実行するとちゃんと通るんですけどねぇ。
(あ、ちなみにこのアプリのフローの図は偏差値のサンプルと違ってちゃんと出ました。横に長くなって線がかぶってしまうのは仕方ないと思います(笑))
また、エラーによりお手数をお掛けして申し訳ありません。
こちらでエラーの原因について調査しましたので、結果をコメント致します。
スタンドアローンモードの「Unexpected key」については、Reducerの初期化処理の
バグによるものでした。
タスク間でReducerインスタンスが使い回されることが考慮されておらず、keyを
チェックするためのインスタンス変数が正しく初期化されていませんでした。
次バージョンで修正される予定です。
OutOfMemoryErrorについては、GroupSort処理の書き方により回避することが可能です。
同一キーのエンティティ数が多い場合、mergeメソッドに渡されるエンティティのリストが
メモリを大量に消費してしまいます。
そのような場合は、エンティティを1件ずつ引数に取る別メソッドを利用します。
具体的には、以下のように実装することができます。
https://s3-ap-northeast-1.amazonaws.com/azarea-cluster-jp/public/SalesFlow.txt
開発ガイドのp.67に記載がありますが、分かりにくかったかもしれません。
改善を検討したいと思います。