Hadoop Distributed File System(HDFS)バランサーを使用して、データ ブロックの分散を分析し、DataNode に格納されているデータを再分散できます。このトピックでは、HDFS バランサーの使用方法と、バランサーのチューニング パラメーターの設定方法について説明します。
背景情報
HDFS はマスタースレーブアーキテクチャを採用しています。NameNode は、ファイル名、ブロック情報、ファイルの場所など、ファイルシステムのメタデータを管理します。実際のデータ ブロックは複数の DataNode に格納されます。マスタースレーブアーキテクチャにより、データを異なる場所に格納できるため、ファイルシステムのフォールトトレランスが向上します。
ファイルが追加、削除、または変更されると、DataNode 間のデータ分散が不均一になる可能性があります。特定の DataNode のストレージ容量がほぼ満杯になり、他の DataNode のストレージ容量はアイドル状態のままです。データ分散が不均一になると、ファイルシステムのストレージ効率が低下し、データ損失のリスクが高まります。これは、大量のデータを格納する DataNode はハードウェア障害の影響を受けやすいためです。
上記の問題を解決するために、HDFS はバランサツールを提供しています。これは、DataNode 間のデータ分散を再調整するために使用されるコマンドラインツールです。HDFS バランサーは、DataNode 間でデータ ブロックを移動して、データ分散を再調整します。これにより、クラスターのストレージリソースを効率的に使用できます。
DataNode の容量とストレージ容量の使用状況を表示する
DataNode の容量とストレージ容量の使用状況を表示して、ストレージリソースの割り当てを確認し、ストレージ不足に関する問題を早期に特定して解決し、データがノード間で均等に分散されるようにすることができます。これにより、システム全体のパフォーマンスと安定性が向上します。
管理するクラスターのマスターノードにログオンします。詳細については、「クラスターへのログオン」をご参照ください。
次のコマンドを実行して、各 DataNode の容量とストレージ容量の使用状況を表示します。
hdfs dfsadmin -report結果は、各 DataNode の合計容量、使用済みストレージ容量、ストレージ容量の使用率、残りのストレージ容量などの情報を示しています。これにより、ストレージの不均衡の問題を特定できます。
データ分散が非常に不均一な場合は、HDFS バランサーを起動できます。たとえば、特定の DataNode のストレージ容量の使用率が他のノードよりもはるかに高く、その差がデフォルトまたは指定されたバランスしきい値を超えている場合です。ほとんどの場合、しきい値は 10% です。
HDFS バランサーを使用する
方法 1:hdfs balancer コマンドを実行する
次のコマンドを実行して、HDFS バランサーを設定します。
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>]次の表に、HDFS バランサーのパラメーターを示します。
パラメーター | 説明 |
threshold | ディスク使用率の差のしきい値(パーセント)。 デフォルト値:10%。この値を設定すると、各 DataNode のディスク使用率がクラスター全体のディスク使用率と 10% 以内で異なるようになります。 クラスター全体のディスク使用率が高い場合は、このパラメーターを小さい値に設定します。 クラスターに多数のノードを追加した場合は、このパラメーターを大きい値に設定して、使用率の高いノードから使用率の低いノードにデータを移動できます。 |
policy | バランシング ポリシー。有効な値:
|
exclude | 特定の DataNode を除外します。 |
include | バランシング操作を実行する DataNode を指定します。 |
source | ソースノードとして機能する DataNode。 |
blockpools | HDFS バランサーを実行するブロック プール。 |
idleiterations | 許可されるアイドル ループの最大数。デフォルト値:5。 |
方法 2:start-balancer.sh ツールを使用する
hdfs daemon start balancer コマンドを実行して、start-balancer.sh ツールを使用できます。 start-balancer.sh ツールを使用するには、次の操作を実行します。
管理するクラスターのノードにログオンします。詳細については、「クラスターへのログオン」をご参照ください。
オプション。 次のコマンドを実行して、HDFS バランサーの最大帯域幅を変更します。
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>説明<bandwidth in bytes per second>は、1 秒あたりの最大帯域幅を指定します。たとえば、最大帯域幅を 200 MB/s に設定する場合、<bandwidth in bytes per second> を 209715200(バイト単位)に設定します。これは、次の式に基づいて計算されます。200 × 1024 × 1024。完全なコマンドはhdfs dfsadmin -setBalancerBandwidth 209715200です。ネットワークリソースを最大限に活用し、コアビジネスの継続性を確保するために、クラスターの負荷が高い場合は、最大帯域幅に小さい値を指定することをお勧めします。たとえば、値を 20971520(20 MB/s を示す)に設定できます。データバランシングプロセスを高速化するために、クラスターがアイドル状態の場合は、最大帯域幅に大きい値を指定することをお勧めします。たとえば、値を 1073741824(1 GB/s を示す)に設定できます。次のコマンドを実行して、hdfs ユーザーに切り替え、HDFS バランサーを実行します。
DataLake クラスター
su hdfs /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5Hadoop クラスター
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5説明-thresholdパラメーターは、データバランシングのしきい値を指定します。しきい値を 5% に設定すると、HDFS バランサーは、DataNode のデータストレージ容量とクラスターの平均ストレージ容量の差が 5% 以下の場合、データが均等に分散されていると判断し、DataNode から、または DataNode へデータ ブロックを移動しなくなります。ビジネス要件に基づいてこのパラメーターを設定し、期待されるバランス効果を実現できます。
次のコマンドを実行して、HDFS バランサーの状態を確認します。
DataLake クラスター
tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.logHadoop クラスター
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 が含まれている場合、HDFS バランサーは想定どおりに実行されています。
HDFS バランサーのチューニング パラメーター
HDFS バランサーはシステムリソースを消費します。HDFS バランサーは、オフピーク時に使用することをお勧めします。デフォルトでは、HDFS バランサーのパラメーターを変更する必要はありません。HDFS バランサーのパラメーターを変更する場合は、E-MapReduce(EMR)コンソールの HDFS サービス ページの [設定] タブに移動し、[hdfs-site.xml] をクリックします。 [hdfs-site.xml] タブで、ビジネス要件に基づいてクライアントと DataNode の設定を調整します。
クライアント設定
パラメーター
説明
dfs.balancer.dispatcherThreads
HDFS バランサーが移動する必要のあるブロックを特定するために使用するディスパッチャ スレッドの数。HDFS バランサーが 2 つの DataNode 間で特定量のデータを移動する前に、バランサーは必要な量のデータがスケジュールされるまで、移動するブロックのブロック リストを繰り返し取得します。
説明デフォルト値は 200 です。
dfs.balancer.rpc.per.sec
ディスパッチャ スレッドが 1 秒あたりに送信するリモート プロシージャ コール(RPC)の数。デフォルト値:20。
HDFS バランサーが 2 つの DataNode 間でデータを移動する前に、バランサーはディスパッチャ スレッドを使用して getBlocks()RPC を NameNode に繰り返し送信します。これにより、NameNode に大きな負荷がかかります。この問題を防ぎ、クラスターの負荷を分散するために、このパラメーターを設定して、1 秒あたりに送信される RPC の数を制限することをお勧めします。
たとえば、負荷の高いクラスターの場合、パラメーターの値を 10 または 5 減らすことで、全体的な移動の進行状況への影響を最小限に抑えることができます。
dfs.balancer.getBlocks.size
毎回移動されるブロックの合計データ サイズ。HDFS バランサーが 2 つの DataNode 間でデータを移動する前に、バランサーは必要な量のデータがスケジュールされるまで、移動するブロックのブロック リストを繰り返し取得します。デフォルトでは、各ブロック リストのブロックのサイズは 2 GB です。NameNode が getBlocks()RPC を受信すると、NameNode はロックされます。RPC が多数のブロックを照会する場合、NameNode は長期間ロックされます。これにより、データの書き込み速度が低下します。この問題を防ぐために、NameNode の負荷に基づいてこのパラメーターを設定することをお勧めします。
dfs.balancer.moverThreads
ブロックの移動に使用されるスレッドの総数。各ブロックの移動にはスレッドが必要です。デフォルト値:1000。
DataNode 設定
パラメーター
説明
dfs.datanode.balance.bandwidthPerSec
クラスターのワークロードのバランスをとるために使用される各 DataNode の帯域幅。帯域幅を 100 MB/s に設定することをお勧めします。 dfsadmin -setBalancerBandwidth パラメーターを設定して、帯域幅を調整することもできます。DataNode を再起動する必要はありません。
たとえば、クラスターの負荷が低い場合は帯域幅を増やし、クラスターの負荷が高い場合は帯域幅を減らすことができます。
dfs.datanode.balance.max.concurrent.moves
DataNode で許可される同時ブロック移動の最大数。デフォルト値:5。このパラメーターは、ディスクの数に基づいて設定できます。このパラメーターは、DataNode の上限として
4 × ディスクの数に設定することをお勧めします。たとえば、DataNode に 28 個のディスクがある場合、このパラメーターを HDFS バランサーで 28 に、DataNode で 112 に設定します。クラスターの負荷に基づいて値を調整できます。クラスターの負荷が低い場合は値を増やし、クラスターの負荷が高い場合は値を減らすことができます。
FAQ
Q:しきい値パラメーターを 10% に設定しても、バランシング操作の実行後になぜ約 20% の差が生じるのですか?
A:しきい値パラメーターは、各 DataNode の使用率がクラスターの平均使用率よりもはるかに高くなったり低くなったりするのを防ぐために使用されます。その結果、バランシング操作の実行後、使用率が最も高い DataNode と最も低い DataNode の差が 20% になる可能性があります。差を小さくするには、しきい値パラメーターを 5% に設定します。