[Hadoop]複数ディスクを使って効率の良い処理
Hadoop では一つのノードあたり複数ディスクを使うことができますが,ディスクを増やすことによってどれくらい性能が向上するか調べました.
HDFSで使用するディスクをdfs.data.dirにコンマ区切りで記入することで複数使えます.
<property>
<name>dfs.data.dir</name>
<value>/data/local/${user.name}/hadoop/dfs/data,
/data/local2/${user.name}/hadoop/dfs/data</value>
</property>
しかし,これだけではまだダメで,mapタスク,reduceタスクが中間データを書き込むディスクも複数指定しなしとHadoopのジョブで複数ディスクを効率良く使えません.mapred.local.dir で設定可能です.
<property>
<name>mapred.local.dir</name>
<value>/data/local/${user.name}/hadoop/mapred/local,
/data/local2/${user.name}/hadoop/mapred/local</value>
</property>
これで16ノードで100GBをソートしました.CPUはXeon E5410 2.33GHz(2 ソケットx4 コア),メモリ容量は24GB.
Hadoop 付属のteragenで100GBデータを生成後,またteragenを使って最初のファイルをメモリから追い出す.(メモリが24GBもあって追い出すのが大変...orz )
そして最初に作った入力データをterasort.コマンドは以下です.
% hadoop jar hadoop-0.20.1-examples.jar teragen 1000000000 input % hadoop jar hadoop-0.20.1-examples.jar teragen 4000000000 flush % hadoop jar hadoop-0.20.1-examples.jar terasort input output
[結果]
1disk: 581 秒
2disk: 385 秒
50%早くなりました.さらにこの時のタイムラインを見ると,
MapフェーズとReduceフェーズにそれぞれにかかってる時間の割合はそのままで実行時間が早くなってます.
でも,ディスクがボトルネックなんだからほぼ2倍にスケールして欲しかったところ.
この結果を取った後にわかったことだけど,他にも複数ディスクを利用できる場所があって,
| dfs.client.buffer.dir | データノードがデータを送信する前のバッファとして使う場所 |
| mapred.temp.dir | 一時ファイルの置き場所 |
dfs.client.buffer.dirは特に性能に影響する気が...
これも設定して計り直さないと.
ノードあたりのディスク数を増やすことによって性能が向上すれば,コスト的にもいいかと思います.(電力も含め)
yahooはノードあたり4ディスク使っていて,Googleではノードあたり16ディスクも使ってます.
今はノードあたり2ディスクの環境しかなくて試せないけど,もっと多い台数で試したいものです.
増やしてそのままスケールするならHadoop用クラスタの条件としてノードあたりのHDDの数は重要かと思います.
—- 追記 —-
コメントにもありますが、dfs.buffer.dir はもう使われてないそうです。
https://issues.apache.org/jira/browse/HADOOP-3756



[...] 複数ディスクを使って効率の良い処理 2010/2/22 http://shun0102.net/?p=75 [...]