[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%早くなりました.さらにこの時のタイムラインを見ると,

ディスク1の場合

ディスク2の場合

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

Comments

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

大変参考になりました。ありがとうございます。
ご存知かとは思いますが、1点だけ。
dfs.client.buffer.dirはもう使われなくなっています。
0.19.0以降はconfiguration file(例えば、0.19.2までなら、
hadoop-default.xml)からも既に削除されています。
以下をご参考ください。

https://issues.apache.org/jira/browse/HADOOP-3756

もう使われてないのですか、知りませんでした・・・
ありがとうございます。
HDFS上でのMapRedueのジョブではほとんどローカルディスクへの読み書きなのにローカルディスクをバッファとして使うのは意味があるのかと疑問に思っていましたが。

S3の場合は fs.s3.buffer.dir という設定があるようですね。

コメントをどうぞ

(必須)

(必須)