HDFSの再バランス

CDH5

HDFSには、DataNode間でディスク使用量の再バランスを行う balaner 機能があります。また、Hadoop3.xで導入される予定の、DataNode内のディスク間のリバランス機能(Disk Balancer)もあります。(この機能はCDH5.8.2以降でも利用できます)
今回はノード間の再バランスについて、次回は新しいディスク間のバランス機能について紹介する予定です。

再バランスの必要性

HDFSはデータを分散して保存します。長期間に渡ってデータの追加や削除が行われると、徐々にノード間でディスク使用量の偏りが生じていきます。また、新しいノードを追加すれば、明らかに偏りが生じる原因となります。

再バランス前

before_rebalanceこのような場合、管理者は負荷の低い時間帯などに、明示的にノード間での再バランスを行う必要があります。(注: HDFSには自動で再バランスする機能はありません)

再バランス後

after_rebalanceスレッシュホールドの値次第で若干偏りは残るが、通常厳密に揃える必要はない。

Cloudera Managerからバランサーを実行

Cloudera ManagerにはBalancer Roleとしてバランサーユーティリティが含まれています。balancerはスクリーンショットのようにグレーアウトされていますが、常駐しているサービスではないのでこれで正常です。
balancer1
HDFSの「アクション」メニューから「再バランス」を選びます。
balancer2確認のダイアログが表示され、OKを押すと再バランスが始まります。
balancer3
balancer4ステータスが「完了」になれば終了ですが、balancerは途中で止めても問題ないため、そのまま他の作業を行っても構いません。

balancerの設定

Cloudera Managerからは、再バランスしきい値(スレッシュホールド)と再バランスポリシーを設定できます。
それぞれのヘルプは次の通り。

しきい値:ノードが再バランスされた後の、平均使用率からの偏差の割合です。 (例: 10% の場合は「10.0」

ポリシー:HDFS ストレージを再バランスするために使用するポリシーです。デフォルトの DataNode ポリシーは、DataNode レベルでストレージをバランシングします。これは、以前のリリースのバランシングポリシーと同様です。BlockPool ポリシーは、DataNode レベルだけでなく、ブロックプールレベルでもストレージをバランシングします。BlockPool ポリシーは、Federated HDFS サービスだけに関連します。

それ以外のパラメータの設定はできません。

コマンドラインからバランサーを実行

再バランスはコマンドラインから実行できます。その場合、スーパーユーザー(hdfsユーザー)として実行する必要があります。
[code]
sudo -u hdfs hdfs balancer
[/code]
(HDFSのドキュメントから抜粋し、一部抄訳)

Usage:

    hdfs balancer
          [-threshold <threshold>]
          [-policy <policy>]
          [-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
          [-include [-f <hosts-file> | <comma-separated list of hosts>]]
          [-idleiterations <idleiterations>]
COMMAND_OPTION Description
-policy <policy> datanode (デフォルト): 各datanodeがバランスされていればクラスタはバランスされている
blockpool: datanodeにあるblock poolがバランスされていればクラスタはバランスされている
-threshold <threshold> ディスク容量のキャパシティ。これはデフォルトのスレッシュホールドを上書きする
-exclude -f <hosts-file> | <comma-separated list of hosts> 特定のDataNodeをbalancerによってバランスされることから除外
-include -f <hosts-file> | <comma-separated list of hosts> 特定のDataNodeのみをbalancerによってバランスされるようにする
-idleiterations <iterations> 終了する前に最大のアイドルの繰り返し回数。デフォルトの回数(5)を上書きする

クラスタバランスユーティリティを実行します。 管理者はCtrl + Cを押すだけで再バランス処理を停止できます。

blockpoolポリシーはdatanodeポリシーよりも厳密であることに注意してください。

チューニングパラメータ

興味深いbalancer関係のパラメータなど

  • dfs.datanode.balance.bandwithPerSec:再バランス時に使用する帯域
  • dfs.datanode.balance.max.concurrent.moves:バランス時に並列で移動するブロック数
  • dfs.datanode.block-pinning.enabled: ブロックのピンニング。有効(true)の場合はブロックをDataNodeにピンニング(貼り付けておく)ことができる。つまり再バランスの対象外にできる。(HDFS-6133)
  • dfs.balancer.max-size-to-move: HDFS-8818 (hadoop 2.7.4 >)

まとめ

再バランスは手動で行う必要があるため、管理者は明示的に実施してください。途中で中断することもできますが、ネットワークに負荷がかかるので影響の少ない時間帯に行うようにした方が良いです。

HBaseに関する補足

再バランスの影響

HBaseを運用している環境でHDFSの再バランスを行うと、RegionServerのローカリティが失われてしまいます。つまり、RegionServerがストアファイルを読み込む際に、同じマシンで動作しているDataNode(つまりローカルディスク)からではなく、リモートのDataNode(つまりリモートのディスク)からネットワーク経由でデータにアクセスしなければならず、読み込みパフォーマンスに影響が生じます。
しかし、MemStoreのフラッシュ、マイナーコンパクション、メジャーコンパクションなどによってRegionServerからローカルのDataNode(つまりローカルディスク)に書き込みが行われるので、徐々にローカリティが回復していきます。特に読み込みが激しいHBaseの環境では注意してください。
ただし、HDFS-6133ではreplica pinningという機能が追加され、例えば/hbase以下は再バランスの対象外にすることができます。

HBASE_17760の修正により、上記の記述「/hbase以下は再バランスの対象外」の記述が不正確だとわかりました。HBase Documentの次の記述をご覧ください。(2020/8/21追記)
The HBase Balancer and HDFS Balancer are incompatibleThe HDFS balancer attempts to spread HDFS blocks evenly among DataNodes. HBase relies on compactions to restore locality after a region split or failure. These two types of balancing do not work well together.

In the past, the generally accepted advice was to turn off the HDFS load balancer and rely on the HBase balancer, since the HDFS balancer would degrade locality. This advice is still valid if your HDFS version is lower than 2.7.1.

HDFS-6133 provides the ability to exclude favored-nodes (pinned) blocks from the HDFS load balancer, by setting the dfs.datanode.block-pinning.enabled property to true in the HDFS service configuration.

HBase can be enabled to use the HDFS favored-nodes feature by switching the HBase balancer class (conf: hbase.master.loadbalancer.class) to org.apache.hadoop.hbase.favored.FavoredNodeLoadBalancer which is documented here.

HDFS-6133 is available in HDFS 2.7.0 and higher, but HBase does not support running on HDFS 2.7.0, so you must be using HDFS 2.7.1 or higher to use this feature with HBase.

コメント