HDFS バランサーは、ブロックの分布を分析し、クラスター全体でストレージ使用率を均等に保つために、DataNode 間でデータを再分配します。
背景情報
HDFS はマスター・スレーブアーキテクチャを採用しています。NameNode はファイル名やデータブロックの位置など、ファイルシステムのメタデータを管理します。一方、複数の DataNode が実際のデータブロックを格納します。このアーキテクチャにより、データ冗長性が確保され、システムのフォールトトレランスが向上します。
時間の経過とともに、ファイルの追加・削除・変更などの操作により、DataNode 間のデータ分布が不均等になることがあります。一部のノードはストレージ容量の限界に近づく一方で、他のノードには十分な空き領域が残っている状態です。このような不均衡はストレージ効率を低下させ、過剰に使用されているノードがハードウェア障害に対してより脆弱になるため、データ損失のリスクを高めます。
この問題に対処するため、HDFS には HDFS バランサーというコマンドラインユーティリティが用意されています。これは DataNode 間でデータブロックを移動させ、ストレージの不均衡を解消し、リソース使用率を改善します。
DataNode の容量と使用量の確認
DataNode の容量と使用量を確認し、ストレージの不均衡を特定して、リバランスが必要かどうかを判断します。
-
対象クラスターのマスターノードに接続します。詳細については、「クラスターへの接続」をご参照ください。
-
次のコマンドを実行して、各 DataNode の容量と使用量を表示します。
hdfs dfsadmin -report
出力には、各 DataNode の総容量、使用済み領域、使用率、および残り領域が表示されます。
DataNode 間のストレージ使用率の差が設定されたしきい値(デフォルトは 10%)を超えた場合に、HDFS バランサーを開始します。
HDFS バランサーの開始
方法 1:hdfs balancer コマンドの使用
hdfs balancer コマンドの構文は次のとおりです。
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
次の表は、バランサーの主なパラメーターについて説明しています。
|
パラメーター |
説明 |
|
threshold |
クラスター全体の平均ディスク使用率からの許容される偏差のパーセンテージです。 デフォルト値は 10% で、任意の DataNode の使用率がクラスター平均の ±10% の範囲内にあることを意味します。 クラスター全体の使用率が高い場合は、バランサーが移動可能なブロックを見つけられなくなるのを防ぐため、この値を下げることを推奨します。 クラスターに多数の新規ノードを追加した場合は、使用率の高いノードから低いノードへのデータ移動を加速するために、この値を上げることができます。 |
|
policy |
バランス調整ポリシーです。次のポリシーがサポートされています。
|
|
exclude |
バランス調整操作から指定された DataNode を除外します。 |
|
include |
バランス調整操作に指定された DataNode のみを含めます。 |
|
source |
データ移動のソースとして使用できる DataNode を指定します。 |
|
blockpools |
指定されたブロックプールでのみバランサーを実行します。 |
|
idleiterations |
バランサーが終了するまでの最大アイドル反復回数です。デフォルト値 5 をオーバーライドします。 |
方法 2:start-balancer.sh ツールの使用
start-balancer.sh スクリプトは、hdfs daemon start balancer コマンドを呼び出すラッパーです。スクリプトを使用するには、次の手順に従います。
-
対象クラスター内の任意のノードに接続します。詳細については、「クラスターへの接続」をご参照ください。
-
オプション: 次のコマンドを実行して、バランサーの最大帯域幅を設定します。
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>説明<bandwidth in bytes per second>パラメーターは最大帯域幅を指定します。たとえば、帯域幅を 200 MB/s に設定する場合、値は 209,715,200(200 * 1024 * 1024 バイト)です。完全なコマンドはhdfs dfsadmin -setBalancerBandwidth 209715200です。高負荷時のネットワーク使用率を最適化し、重要なサービスを保護するために、バランス調整の帯域幅を 20,971,520(20 MB/s)などに減らすことを推奨します。非ピーク時間帯には、バランス調整プロセスを高速化するために、帯域幅を 1,073,741,824(1 GB/s)などに増やすことができます。 -
次のコマンドを実行して
hdfsユーザーに切り替え、バランサースクリプトを実行します。-
DataLake クラスター
su hdfs /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5 -
Hadoop クラスター
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5説明-threshold 5パラメーターはバランス調整のしきい値を設定します。しきい値 5% とは、DataNode のストレージ使用率がクラスターの平均使用率の ±5% 以内であれば、そのノードはバランスが取れているとみなされることを意味します。その場合、バランサーはそのノードとの間でデータブロックを移動しません。環境に応じて、この値を調整して目的のバランスを実現できます。
-
-
次のコマンドを実行して、バランサーの進行状況をモニターします。
-
DataLake クラスター
tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log -
Hadoop クラスター
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.log説明ログファイル名
hadoop-hdfs-balancer-master-1-1.c-xxx.logおよびhadoop-hdfs-balancer-emr-header-xx.cluster-xxx.logは例です。ご利用のクラスターの実際のログファイル名を使用してください。
出力に
Successfullyという単語が含まれている場合、操作は成功しています。 -
バランサー パラメーターの調整
バランサーはシステムリソースを消費するため、非ピーク時間帯に実行してください。デフォルトでは、パラメーターの調整は不要です。調整が必要な場合は、E-MapReduce コンソールの HDFS サービスページに移動し、 を選択して、次の構成を調整します。
-
クライアント構成
パラメーター
説明
dfs.balancer.dispatcherThreads
データブロックを移動する前に、バランサーは各反復でブロックリストを取得し、それを mover スレッドにディスパッチします。
説明dispatcherThreads パラメーターは、このディスパッチタスクのスレッド数を定義します。デフォルトは 200 です。
dfs.balancer.rpc.per.sec
1 秒あたりに送信される RPC の数です。デフォルトは 20 です。
ディスパッチャースレッドは NameNode に対して多数の
getBlocksRPC 呼び出しを行います。NameNode への過剰な負荷を防ぐために、これらの RPC のレートを制御できます。たとえば、高負荷クラスターでは、この値を 10 または 5 に減らすことができます。これにより、データ移動の全体的な進行状況への影響は最小限に抑えられます。
dfs.balancer.getBlocks.size
各反復で、バランサーは mover スレッド用のブロックリストを取得します。このパラメーターはそのリスト内のブロックの合計サイズを設定し、デフォルトは 2 GB です。
getBlocks処理は NameNode をロックするため、NameNode の現在の負荷に基づいてこの値を調整できます。dfs.balancer.moverThreads
データブロックを移動するスレッド数です。各スレッドは 1 つのブロック移動を処理します。
デフォルト値は 1000 です。
-
DataNode 構成
パラメーター
説明
dfs.datanode.balance.bandwidthPerSec
DataNode がバランス調整に使用できる帯域幅を指定します。推奨設定は 100 MB/s です。dfsadmin -setBalancerBandwidth コマンドを使用して、DataNode を再起動せずにこの値を動的に調整することもできます。
たとえば、低負荷期間には帯域幅を増やし、高負荷期間には帯域幅を減らします。
dfs.datanode.balance.max.concurrent.moves
DataNode が同時に移動できるブロックの最大数です。デフォルトは 5 です。
通常、この値はディスクの数に対応させる必要があります。DataNode 側で上限を
4 * <number disks="" id="37b28fc25e9tt" of=""></number>に設定し、その後バランサーを使用して調整することを推奨します。たとえば、DataNode に 28 個のディスクがある場合、バランサー側で値を 28 に設定し、DataNode 側で
28 * 4に設定できます。クラスターの負荷に基づいて値を調整してください。負荷が低い場合は同時移動数を増やし、負荷が高い場合は減らします。
よくある質問
Q:しきい値を 10% に設定しても、バランス調整後にノード間の使用率差が約 20% のままなのはなぜですか?
A:threshold パラメーターは、各 DataNode の使用率がクラスターの平均使用率から指定されたパーセンテージ以上ずれないようにすることを保証します。したがって、バランス調整後、最も使用率が高いノードと最も低いノードの間の使用率ギャップは、しきい値の最大 2 倍になる可能性があります。たとえば、あるノードが平均より 10% 高く、別のノードが平均より 10% 低い場合、両者のギャップは 20% になります。このギャップを縮小するには、threshold を 5% などのより小さい値に設定してみてください。