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 が教えてくれたのでやってみた。
しかし、私のケースではあまり効果なかった…