すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:HDFS バランサー

最終更新日:Jul 18, 2026

HDFS バランサーは、ブロックの分布を分析し、クラスター全体でストレージ使用率を均等に保つために、DataNode 間でデータを再分配します。

背景情報

HDFS はマスター・スレーブアーキテクチャを採用しています。NameNode はファイル名やデータブロックの位置など、ファイルシステムのメタデータを管理します。一方、複数の DataNode が実際のデータブロックを格納します。このアーキテクチャにより、データ冗長性が確保され、システムのフォールトトレランスが向上します。

時間の経過とともに、ファイルの追加・削除・変更などの操作により、DataNode 間のデータ分布が不均等になることがあります。一部のノードはストレージ容量の限界に近づく一方で、他のノードには十分な空き領域が残っている状態です。このような不均衡はストレージ効率を低下させ、過剰に使用されているノードがハードウェア障害に対してより脆弱になるため、データ損失のリスクを高めます。

この問題に対処するため、HDFS には HDFS バランサーというコマンドラインユーティリティが用意されています。これは DataNode 間でデータブロックを移動させ、ストレージの不均衡を解消し、リソース使用率を改善します。

DataNode の容量と使用量の確認

DataNode の容量と使用量を確認し、ストレージの不均衡を特定して、リバランスが必要かどうかを判断します。

  1. 対象クラスターのマスターノードに接続します。詳細については、「クラスターへの接続」をご参照ください。

  2. 次のコマンドを実行して、各 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

バランス調整ポリシーです。次のポリシーがサポートされています。

  • datanode(デフォルト):各 DataNode の使用率がしきい値内にある場合に、クラスターはバランスが取れているとみなされます。

  • blockpool:各 DataNode 上のブロックプールがバランス基準を満たしている場合に、クラスターはバランスが取れているとみなされます。

exclude

バランス調整操作から指定された DataNode を除外します。

include

バランス調整操作に指定された DataNode のみを含めます。

source

データ移動のソースとして使用できる DataNode を指定します。

blockpools

指定されたブロックプールでのみバランサーを実行します。

idleiterations

バランサーが終了するまでの最大アイドル反復回数です。デフォルト値 5 をオーバーライドします。

方法 2:start-balancer.sh ツールの使用

start-balancer.sh スクリプトは、hdfs daemon start balancer コマンドを呼び出すラッパーです。スクリプトを使用するには、次の手順に従います。

  1. 対象クラスター内の任意のノードに接続します。詳細については、「クラスターへの接続」をご参照ください。

  2. オプション: 次のコマンドを実行して、バランサーの最大帯域幅を設定します。

    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)などに増やすことができます。

  3. 次のコマンドを実行して 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% 以内であれば、そのノードはバランスが取れているとみなされることを意味します。その場合、バランサーはそのノードとの間でデータブロックを移動しません。環境に応じて、この値を調整して目的のバランスを実現できます。

  4. 次のコマンドを実行して、バランサーの進行状況をモニターします。

    • 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 サービスページに移動し、Configure > hdfs-site.xml を選択して、次の構成を調整します。

  • クライアント構成

    パラメーター

    説明

    dfs.balancer.dispatcherThreads

    データブロックを移動する前に、バランサーは各反復でブロックリストを取得し、それを mover スレッドにディスパッチします。

    説明

    dispatcherThreads パラメーターは、このディスパッチタスクのスレッド数を定義します。デフォルトは 200 です。

    dfs.balancer.rpc.per.sec

    1 秒あたりに送信される RPC の数です。デフォルトは 20 です。

    ディスパッチャースレッドは NameNode に対して多数の getBlocks RPC 呼び出しを行います。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% などのより小さい値に設定してみてください。