HDFSのDataNodeで、ディスクの空きが多い方からデータを書き込む方法


HDFSにおける DataNode(以下DN) に対する分散書き込みを、DNのディスクボリューム間で釣り合いがとれるようにするよう設定することができる。

環境

  • CDH 5.8.0
  • Hadoop 2.6.0 ベース

概要

デフォルトではDNはラウンドロビンで新しいブロックレプリカをディスクボリュームに書き込む。
新しいレプリカの場所を決定するときにそれぞれのボリュームの空き容量を考慮してボリュームを選択するポリシーをDNに設定することができる。

設定できる内容は以下の通り。

  • DNボリューム同士の空きディスク容量の差分の許容範囲(バイト)
  • 新しいブロック割り当てが、より空きディスク容量の大きいボリュームに送られる割合(パーセント)

プロパティの説明

以下、プロパティと設定に必要な変更の値についての一覧を示す。プロパティの説明については Cloudera Manager の説明文を引用した。

DataNodeボリューム選択ポリシー

プロパティ: dfs.datanode.fsdataset.volume.choosing.policy
デフォルト値: org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy
設定値: org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy

新しいブロックを取得するボリュームを決定するための DataNode ポリシーです。

空き容量バランス維持ポリシーしきい値

プロパティ: dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold
デフォルト値: 10737418240
設定値: 10737418240

DataNode ボリューム選択ポリシーを[空き容量]に設定した場合にのみ使用されます。DataNode ボリュームの間で、ディスクの空き容量の差異として許容するバイト数を制御します。この値を超えると、ボリューム間のバランスが崩れたと判断されます。すべてのボリュームの空き容量が互いにこの範囲内の場合、ボリュームはバランスがとれていると判断され、ブロックの割り当ては正規のラウンドロビン方式で行われます。

空き容量バランス維持ポリシー設定

プロパティ: dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction
デフォルト値: 0.75
設定値: 0.75

DataNode ボリューム選択ポリシーを[空き容量]に設定した場合にのみ使用されます。利用可能なディスクスペースが他のボリュームよりも多いボリュームに、新しいブロック割り当てからどのような割合で送信するかを制御します。この設定は、0.0~1.0 の範囲で指定する必要があります。ただし、利用可能なディスクスペースが少ないボリュームに対して、ブロックの割り当てを大きくする理由はないため、実際は 0.5~1.0 の範囲で指定します。

既に書き込まれたデータをディスク間でバランシングするには?

残念ながら、CDH5.8.0 時点ではディスク間バランシングの方法はない。
一度デコミッションしてデータを削除してからリコミッションするという形でバランシングするしかない。

アップストリームでは HDFS-1312 でパッチが作成され、Hadoop 3.0.0 ターゲットでクローズしているため、CDH にバックポートされる日も遠くはないだろう。

[2016/10/20追記]
CDH 5.8.2 でディスク間バランシングがバックポートされました。詳しくは下記をご覧ください。
http://blog.cloudera.com/blog/2016/10/how-to-use-the-new-hdfs-intra-datanode-disk-balancer-in-apache-hadoop/

参考

Configuring Storage Balancing for DataNodes
http://www.cloudera.com/documentation/enterprise/latest/topics/admin_dn_storage_balancing.html