E-MapReduce (EMR) クラスターでファイルが追加、削除、または変更されると、DataNode 間でのデータ分布が不均一になることがあります。一部の DataNode は満杯になり、他の DataNode はほとんどアイドル状態になります。HDFS バランサーは、この不均衡を修正するために DataNode 間でデータブロックを移動し、データ損失のリスクを軽減し、ストレージ効率を向上させます。
仕組み
Hadoop 分散ファイルシステム (HDFS) は、マスター・スレーブアーキテクチャを使用しています。NameNode はファイルシステムメタデータ (ファイル名、ブロックの場所、ブロック情報) を管理し、DataNode は実際のデータブロックを保存します。
各 DataNode のディスク使用率がクラスター全体のディスク使用率から設定されたしきい値を超えていない場合、クラスターはバランスが取れていると見なされます。たとえば、デフォルトの 10% のしきい値の場合、クラスター全体のディスク使用率が 40% であれば、各 DataNode は 30% から 50% の間に収まる必要があります。これは、最も使用されている DataNode と最も使用されていない DataNode の間の最大差が 20% になる可能性があることを意味します。
前提条件
開始する前に、以下を確認してください。
-
ご利用の EMR クラスターのマスターノードへのアクセス。詳細については、「クラスターにログイン」をご参照ください。
-
バランサーを実行するための
hdfsユーザーアカウント。
DataNode のストレージ使用量を確認
各 DataNode の容量とストレージ使用量を確認するには、マスターノードで次のコマンドを実行します。
hdfs dfsadmin -report
出力には、各 DataNode の総容量、使用済みストレージ、残りストレージ、およびディスク使用率が表示されます。データ分布が極端に不均一な場合 (たとえば、いずれかの DataNode の使用量がクラスター全体の平均からバランスしきい値 (デフォルト: 10%) を超えて異なる場合) は、HDFS バランサーを開始してください。
HDFS バランサーを実行
方法 1: 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 のディスク使用率とクラスター全体のディスク使用率の最大許容差。たとえば、クラスター全体のディスク使用率が 40% の場合、各 DataNode は 30% から 50% の間に収まる必要があります。よりきめ細かなバランスを実現するには、5% などの低い値を設定します。 |
policy |
datanode |
バランシングポリシー。datanode: すべての DataNode がバランスされている場合にクラスターがバランスされます。blockpool: 各 DataNode のすべてのブロックプールがバランスされている場合にクラスターがバランスされます。 |
exclude |
— | バランシングから除外する DataNode。 |
include |
— | バランシング操作に含める DataNode。 |
source |
— | ブロック移動のソースノードとして使用する DataNode。 |
blockpools |
— | バランサーを実行するブロックプール。 |
idleiterations |
5 | バランサーが終了するまでのアイドル反復の最大数。 |
方法 2: start-balancer.sh スクリプトを使用
hdfs daemon start balancer コマンドを実行して、start-balancer.sh ツールを使用することもできます。start-balancer.sh ツールを使用するには、次の手順を実行します。
-
クラスター内のノードにログインします。詳細については、「クラスターにログイン」をご参照ください。
-
(オプション) 実行中のワークロードへの影響を制限するために、バランサーの最大帯域幅を設定します。
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>負荷の高いクラスターでは、進行中のジョブを保護するために低い値を設定し、アイドル状態のクラスターでは、バランシングをより速く完了するために高い値を設定します。一般的な値は次のとおりです。
目標帯域幅 値 (バイト/秒) 計算 20 MB/秒 (高負荷) 2097152020 × 1024 × 1024 200 MB/秒 209715200200 × 1024 × 1024 1 GB/秒 (アイドルクラスター) 10737418241 × 1024 × 1024 × 1024 -
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% に設定します。この値は、要件に基づいて調整してください。 -
-
進捗を追跡するためにバランサーログを監視します。
-
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
ログに
Successfullyが含まれている場合、バランサーは完了しています。 -
HDFS バランサーをチューニング
本番ワークロードへの影響を最小限に抑えるには、バランサーをオフピーク時間に実行します。ほとんどのクラスターではデフォルト構成が有効ですが、パラメーターを調整する場合は、EMR コンソールの HDFS サービスページの [設定] タブに移動し、[hdfs-site.xml] をクリックします。
クライアントパラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
dfs.balancer.dispatcherThreads |
200 | 移動するブロックを特定するために使用されるディスパッチャースレッドの数。バランサーは、十分なデータが転送のためにスケジュールされるまで、ブロックリストを繰り返し取得します。 |
dfs.balancer.rpc.per.sec |
20 | ディスパッチャースレッドが 1 秒あたりに送信する RPC の数。ディスパッチャースレッドは NameNode に getBlocks() RPC を送信し、これにより NameNode の負荷が増加する可能性があります。負荷の高いクラスターでは、クラスター全体のパフォーマンスへの影響を制限するために、この値を 5 または 10 減らしてください。 |
dfs.balancer.getBlocks.size |
2 GB | 各 getBlocks() 呼び出しでフェッチされるブロックの総データサイズ。NameNode は各 RPC の処理中にロックを保持するため、大きな値は書き込みを遅くする可能性があります。NameNode の負荷に基づいてこれをチューニングしてください。 |
dfs.balancer.moverThreads |
1000 | ブロックを移動するために使用されるスレッドの総数。各ブロック移動は 1 つのスレッドを使用します。 |
DataNode パラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
dfs.datanode.balance.bandwidthPerSec |
— | バランシング操作のための DataNode ごとの帯域幅上限。開始点として 100 MB/秒に設定します。DataNode を再起動せずに hdfs dfsadmin -setBalancerBandwidth を使用して、ランタイム時にこれを調整します。負荷が低い場合は値を増やし、負荷が高い場合は値を減らしてください。 |
dfs.datanode.balance.max.concurrent.moves |
5 | 単一の DataNode での同時ブロック移動の最大数。これを上限として 4 × ディスク数 に設定します。たとえば、28 個のディスクを持つ DataNode の場合、バランサー側の値を 28 に、DataNode 側の値を 112 に設定します。負荷が低い場合は増やし、負荷が高い場合は減らしてください。 |
よくある質問
threshold を 10% に設定してバランサーを実行した後でも、DataNode 間の差が約 20% であるのはなぜですか?
これは予期される動作です。しきい値は、各 DataNode の使用量がクラスター平均からどの程度逸脱できるかを制御するものであり、DataNode 同士がどの程度逸脱できるかを制御するものではありません。10% のしきい値と 40% のクラスター全体のディスク使用率の場合、各 DataNode は 30% から 50% の間に収まります。これは、任意の 2 つの DataNode 間の最大差が 20% であることを意味します。差を減らすには、しきい値を 5% に下げてください。