HDFSには、DataNode間でディスク使用量の再バランスを行う balaner 機能があります。また、Hadoop3.xで導入される予定の、DataNode内のディスク間のリバランス機能(Disk Balancer)もあります。(この機能はCDH5.8.2以降でも利用できます)
今回はノード間の再バランスについて、次回は新しいディスク間のバランス機能について紹介する予定です。
再バランスの必要性
HDFSはデータを分散して保存します。長期間に渡ってデータの追加や削除が行われると、徐々にノード間でディスク使用量の偏りが生じていきます。また、新しいノードを追加すれば、明らかに偏りが生じる原因となります。
再バランス前
このような場合、管理者は負荷の低い時間帯などに、明示的にノード間での再バランスを行う必要があります。(注: HDFSには自動で再バランスする機能はありません)
再バランス後
スレッシュホールドの値次第で若干偏りは残るが、通常厳密に揃える必要はない。
Cloudera Managerからバランサーを実行
Cloudera ManagerにはBalancer Roleとしてバランサーユーティリティが含まれています。balancerはスクリーンショットのようにグレーアウトされていますが、常駐しているサービスではないのでこれで正常です。
HDFSの「アクション」メニューから「再バランス」を選びます。
確認のダイアログが表示され、OKを押すと再バランスが始まります。
ステータスが「完了」になれば終了ですが、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以下は再バランスの対象外にすることができます。
- Clouderaのドキュメント: HDFS Balancers
- Apache Hadoopのドキュメント: HDFS command guide
- Apache Hadoopのドキュメント: HDFS User Guide
コメント