ディスクバランサーは、データノードのすべてのディスクにデータを均等に分散するコマンドラインツールです。このツールは、クラスタ全体のデータバランスを調整するBalancerとは異なります。大量の書き込みや削除、またはディスクの交換などが原因で、ノード上のディスク間でデータの分散が不均一になる場合があります。このツールは、指定されたデータノードに対して動作し、あるディスクから別のディスクにブロックを移動します。
ディスクバランサーは、プランを作成して、そのプランをデータノードで実行することで動作します。プランとは、2つのディスク間でどのくらいのデータ量を移動するべきかを記述するステートメントのセットです。プランは複数の移動ステップで構成されます。移動ステップには、ソースディスク、宛先ディスク、移動するバイト数が含まれます。プランは、稼働中のデータノードに対して実行できます。ディスクバランサーは、データのコピー量を毎秒制限するため、他のプロセスに干渉するべきではありません。ディスクバランサーはクラスタでデフォルトで有効になっていることに注意してください。
次のセクションでは、ディスクバランサーでサポートされているコマンドとその使用方法について説明します。
plan コマンドは、次のように実行して、指定されたデータノードに対して実行できます。
hdfs diskbalancer -plan node1.mycluster.com
このコマンドは、一般的なオプションを受け入れます。
plan コマンドには、プランの出力と実行を制御できるパラメータのセットもあります。
コマンドオプション | 説明 |
---|---|
-out |
ユーザーがプランファイルの出力場所を制御できるようにします。 |
-bandwidth |
データノードは稼働中で、他のジョブを実行している可能性があるため、ディスクバランサーは、毎秒移動するデータ量を制限します。このパラメータを使用すると、使用する最大帯域幅を設定できます。これは必須ではなく、指定しない場合はディスクバランサーがデフォルトの帯域幅を使用します。 |
-thresholdPercentage |
データノードのスナップショットに対して動作するため、移動操作には、成功を宣言するための許容範囲パーセンテージがあります。ユーザーが10%を指定し、移動操作のサイズが20GBの場合、18GBを移動できれば、その操作は成功と見なされます。これは、データノードのリアルタイムでの変更に対応するためです。このパラメータは必須ではなく、指定しない場合はデフォルト値が使用されます。 |
-maxerror |
Max error を使用すると、移動ステップを中止する前に、失敗する必要があるブロックコピー操作の数を指定できます。これも必須パラメータではなく、指定しない場合はシステムデフォルトが使用されます。 |
-v |
詳細モード。このパラメータを指定すると、plan コマンドはプランのサマリーを stdout に出力します。 |
-fs |
使用する NameNode を指定します。指定しない場合は、設定ファイルのデフォルト値が使用されます。 |
plan コマンドは、2つの出力ファイルを作成します。1つは<ノード名>.before.json
で、ディスクバランサーの実行前のクラスタの状態をキャプチャし、もう1つは<ノード名>.plan.json
です。
execute コマンドは、plan コマンドを取得して、そのプランが生成されたデータノードに対して実行します。
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
これは、プランファイルからデータノードのアドレスを読み取ることでプランを実行します。DiskBalancer がプランを実行すると、長時間かかる可能性のある非同期プロセスの開始となります。そのため、query コマンドを使用すると、execute コマンドの現在の状態を取得できます。
コマンドオプション | 説明 |
---|---|
-skipDateCheck |
日付チェックをスキップして、プランを強制的に実行します。 |
query コマンドは、データノードからディスクバランサーの現在の状態を取得します。
hdfs diskbalancer -query nodename.mycluster.com
コマンドオプション | 説明 |
---|---|
-v |
詳細モード。個々の移動の状態を出力します。 |
cancel コマンドは、実行中のプランをキャンセルします。データノードを再起動すると、cancel コマンドと同じ効果があります(データノード上のプラン情報は一時的なため)。
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
または
hdfs diskbalancer -cancel planID -node nodename
プランIDは、query コマンドを使用してデータノードから読み取ることができます。
report コマンドは、ディスクバランサーの実行から恩恵を受ける指定されたノードまたは上位ノードの詳細なレポートを提供します。ノードは、ホストファイルまたはノードのカンマ区切りリストで指定できます。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|ホスト名>,...]
または
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
hdfs-site.xml を介して制御できるディスクバランサー設定のセットがあります。
設定 | 説明 |
---|---|
dfs.disk.balancer.enabled |
このパラメータは、クラスタでディスクバランサーを有効にするかどうかを制御します。これが無効になっている場合、データノードは execute コマンドを拒否します。デフォルト値は true です。 |
dfs.disk.balancer.max.disk.throughputInMBperSec |
これは、データのコピー中にディスクバランサーが消費する最大ディスク帯域幅を制御します。10MB の値を指定すると、ディスクバランサーは平均で 10MB/秒しかコピーしません。デフォルト値は 10MB/秒です。 |
dfs.disk.balancer.max.disk.errors |
特定のディスク間の移動について、放棄される前に無視できる最大エラー数を設定します。たとえば、プランにコピーするディスクのペアが3組あり、最初のディスクセットで5つ以上のエラーが発生した場合、最初のコピーを放棄し、プランの2番目のコピーを開始します。最大エラーのデフォルト値は5に設定されています。 |
dfs.disk.balancer.block.tolerance.percent |
許容範囲パーセンテージは、コピーステップで十分な値に達したかどうかを指定します。たとえば、10%を指定した場合、目標値の10%に近い値は十分な値と見なされます。 |
dfs.disk.balancer.plan.threshold.percent |
プランにおけるボリュームデータ密度のパーセンテージしきい値。ノードのボリュームデータ密度がしきい値を超えている場合、ディスクに対応するボリュームはプランでバランスを取る必要があります。デフォルト値は10です。 |
dfs.disk.balancer.plan.valid.interval |
ディスクバランサーのプランが有効な最大時間。時間(例:2s、2m、1hなど)を指定するために、サフィックス(大文字と小文字の区別なし)ms(ミリ秒)、s(秒)、m(分)、h(時間)、d(日)をサポートします。サフィックスを指定しない場合は、ミリ秒と見なされます。デフォルト値は 1d です。 |
ディスクバランサーは2つの出力ファイルを作成します。nodename.before.json には、NameNode から読み取ったクラスタの状態が含まれています。このファイルには、データノードとボリュームに関する詳細情報が含まれています。
このファイルを Apache JIRA に投稿する場合は、個人情報が漏洩する可能性があるため、ホスト名とボリュームパスを置き換える必要がある場合があります。
また、このファイルをトリミングして、JIRA でレポートするノードのみに焦点を当てることもできます。
nodename.plan.json には、特定のノードのプランが含まれています。このプランファイルには、一連のステップが含まれています。ステップは、データノード内で一連の移動操作として実行されます。
ノードの状態を前後で比較するには、plan コマンドを再実行して新しい nodename.before.json と古い before.json を比較するか、ノードに対して report コマンドを実行します。
実行中のプランの進行状況を確認するには、-v オプション付きで query コマンドを実行してください。これにより、一連のステップが出力されます。各ステップは、あるディスクから別のディスクへの移動操作を表します。
移動速度は、指定された帯域幅によって制限されます。帯域幅のデフォルト値は 10MB/秒に設定されています。-v オプションを使用してクエリを実行すると、次の値が表示されます。
"sourcePath" : "/data/disk2/hdfs/dn", "destPath" : "/data/disk3/hdfs/dn", "workItem" : "startTime" : 1466575335493, "secondsElapsed" : 16486, "bytesToCopy" : 181242049353, "bytesCopied" : 172655116288, "errorCount" : 0, "errMsg" : null, "blocksCopied" : 1287, "maxDiskErrors" : 5, "tolerancePercent" : 10, "bandwidth" : 10
ソースパス - コピー元のボリュームです。
宛先パス - コピー先のボリュームです。
開始時間 - ミリ秒単位の現在時刻です。
経過秒数 - 統計情報を更新するたびに更新されます。これは、実際の経過時間よりも遅い場合があります。
コピーするバイト数 - コピーする予定のバイト数です。実際には、この値の前後一定のパーセンテージの範囲内でコピーが行われます。そのため、多くの場合、`コピーされたバイト数`は`コピーするバイト数`よりも小さくなります。デフォルトでは、移動するバイト数の±10%以内であれば十分とみなされます。
コピーされたバイト数 - ソースディスクからデスティネーションディスクに実際に移動されたバイト数です。
エラーカウント - エラーが発生するたびにエラーカウントが増加します。エラーカウントが最大エラーカウント(デフォルト値は5)を下回る限り、移動の完了を試みます。最大エラーカウントに達した場合は、現在のステップを放棄し、計画の次のステップを実行します。
エラーメッセージ - 現在のところ、最後のエラーメッセージを報告する単一の文字列です。以前のメッセージは、データノードのログに記録されています。
コピーされたブロック数 - コピーされたブロックの数です。
最大ディスクエラー数 - この移動ステップで使用される設定です。現在、ステップごとのこれらの値を制御するためのユーザーインターフェースが実装されていないため、デフォルトの設定値が報告されます。これは今後の作業項目です。この値には、計画コマンドで指定されたデフォルト値またはコマンドライン値が使用されます。
許容範囲パーセント - データ移動時の許容誤差を表します。ビジーなクラスタでは、管理者は「計画を計算するが、このノードは使用中であるため、ディスクバランサがコピーするバイト数の±10%の範囲に収まれば問題ない」と言うことができます。
帯域幅 - ディスクバランサによって使用される最大集約ソースディスク帯域幅です。ブロックの移動後、ディスクバランサは、指定された帯域幅でそのブロックの移動に要する時間を秒単位で計算します。実際の移動時間が予想時間よりも短かった場合、ディスクバランサはその時間だけスリープします。現在、すべての移動は単一のスレッドによって順次実行されることに注意してください。