Hadoopアドベントカレンダー2012 #hadoopAC12jpの19日目です。
Asakusa FrameworkでDirect I/O版の偏差値算出サンプルを書きました。
昨日、AZAREA-Clusterフレームワークで偏差値算出サンプルを作ってみたので、AsakusaFW版と比較してみようと思って久しぶりに見てみたのですが、CoGroupを使っていてびっくり^^;
元々、AsakusaFWを初めて試せるようになった頃にWordCountの次に作ったのが偏差値算出サンプルなので、まだ演算子についてもよく分からず、とりあえず何でも出来て便利なCoGroupを使いまくっていたのでした(苦笑)
しかしCoGroupは最適化の妨げになるのでなるべく使わないようにすべき!という訳で、CoGroupを使わないバージョンを作ってみたのでした。
で、出来るには出来たんですが、意外と面倒でしたね^^;
どういうデータモデルを用意してどう演算していけばいいかを考えるのは大変でした。
この辺りはAZAREAでも悩んだので、フローの図が描けるかどうかはあまり関係ないですね^^;
ただ、久しぶりにAsakusaFWがDSL(ドメイン特化言語)を意識していることを実感しました。
Operatorでメソッドを書く(メソッド名を決める)のは、そのドメインの語彙を用意することに相当します。
今回の例で言えば、「偏差値を算出する(というドメイン)」で使う用語(「平均を算出する」とか「標準偏差を算出する」とか)を定義しているわけです。
そして、Jobの定義では(基本的に)その語彙だけを使って処理を記述することが出来ます。
(Eclipseを使うという制約からJavaをホスト言語としているので、くどい表記になっている部分もありますが^^; この辺りはScalaで書けるといいですよね~w)
(ただし、今回作ったものは自分の命名能力が貧弱なせいで あまり良い語彙になっていませんがorz)
(ついでに言えば、Operatorで入出力データの型を決めているので、ジョブを書く際には間違ったデータを入れようとするとコンパイルエラーになるので、誤りは減りますね。型付け万歳!w)
AsakusaFWはフローをGUIで描く機能はありませんが、Graphvizを使って図を生成することは出来ます。
AZAREAのフローに相当するフローグラフと、どのようなMapReduceジョブに変換されるかを表すステージグラフの2種類が出せます。(実際はもっと色々な種類があります)
これらのグラフには前述の“語彙(Operatorのメソッド名)”が表示されるので、ちゃんとした命名をしていれば、グラフを見るだけでおおよそ何をしているか分かるはずです。
で、偏差値算出のプログラムはAsakusaFW版もAZAREA版も似た感じになったのですが、AZAREAのMapReduceは6個でAsakusaFWは4個でした。
一般的にはMapReduceジョブ数が少ない方が全体の実行時間は短くなると思われるので、AsakusaFWは最適化をけっこう頑張ってますよね。
個々のMapReduce処理の効率が分からないので、実際にどちらが速いかは、実行してみないことには何とも言えないのですが。