HDFSではDataNodeの容量はなるだけ均一にしたほうがよい
特に少ない台数でクラスタを組む場合。
以下の様な点に留意。
- DataNode ボリューム選択ポリシーは空き容量ベースに設定する。
- 各DataNodeの容量はなるだけ均一にする。均一にできない場合でも、ちゃんとレプリカが作成できるように留意する。
- DataNodeの容量が不均一だと、Rebalance 等で特定のノードに負荷が集中する場合がある。
- データディレクトリは noatime オプションでマウントするがよい。
DataNode ボリューム選択ポリシーは空き容量ベースに設定する。
DataNode ボリューム選択ポリシー:dfs.datanode.fsdataset.volume.choosing.policy
空き容量ベース:org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
デフォだとラウンドロビンで書き込みに行くので、DataNodeの容量が不均一だと、一番容量が小さいDataNodeの容量を超えて書き込もうとするときっとエラーとか出始める。
各DataNodeの容量はなるだけ均一にする。均一にできない場合でも、ちゃんとレプリカが作成できるように留意する。
例えば、レプリカ係数=2で1TB×3台と4TB×1台でHDFSを構成する場合、3TB書き込んだ時点でレプリカ作れなくなる。そうすると、定常的に「Failed to place enough replicas」とかいうエラーが出続ける。
(実際にやらかしてしまった…事前によく考えよう!)
DataNodeの容量が不均一だと、Rebalance 等で特定のノードに負荷が集中する場合がある。
レプリカ係数=2、1TB×3台 + 5TB×1台でHDFSを構成し、上記の問題に気づいた。
そこで、1TB×2台 + 2TB×1台 + 4TB×1台 に構成を変えた。
手順としては、1TBマシンの一つにもう1TB追加後、5TBマシンから1TB分を取り外した。
(ディスクは1TBづつmountしてあったので、dfs.datanode.data.dir で追加したり削除したりしてDataNodeを再起動という荒っぽいやり方。)
Missing Blocks が出たが、壊れたファイルだけ削除して入れなおした。
ただ、構成を変えてからしばらくは2TBマシンでI/O Waitが出まくった。
どうやら、UnderReplicated Block の Replica 作成の負荷だったようで、UnderReplicated Block がなくなると収まった…
たぶんこの負荷のせいで、WebHDFSでのデータ投入でエラーが頻発した。curlが転送エラーを返したり、「有効なDataNodeがない」と言われたり。
Rebalance も気をつけないと同じようなことになりそう。
データディレクトリは noatime オプションでマウントするがよい。
今まで考えたことが無かったが、Cloudera Manager が教えてくれたのでやってみた。
しかし、私のケースではあまり効果なかった…