How-to: Apache Hadoopで新しいHDFS DataNodeディスク間バランサを使用する

原文: http://blog.cloudera.com/blog/2016/10/how-to-use-the-new-hdfs-intra-datanode-disk-balancer-in-apache-hadoop/

現在、HDFSにはノードでデータを移動するための包括的なストレージ容量管理アプローチが含まれています (CDH 5.8.2以降)。

HDFSでは、DataNodeはhdfs-site.xmldfs.datanode.data.dirを用いて指定できるローカルのファイルシステムディレクトリにデータブロックを分配します。HDFSの用語でボリュームと呼ばれる各ディレクトリは、一般的なインストールでは別のデバイス(たとえば、別のHDDやSSD)上にあります。

新しいブロックをHDFSに書き込む際、DataNodeはボリューム選択ポリシー(volume-choosing policy)を使用してブロックのディスクを選択します。 現在、ラウンドロビン(Round-Robin)、または、空き容量(Available-space)HDFS-1804 )の2つの種類のポリシーがサポートされています。

簡単に言えば、図1に示すように、ラウンドロビンポリシーは新しいブロックを使用可能なディスクに均等に分配し、空き容量ポリシーは最も空き領域の多いディスクに優先的にデータを書き込みます。

図1: ラウンドロビンポリシーと空き容量ポリシー

https://www.cloudera.com/documentation/enterprise/latest/topics/admin_dn_swap.htmlデフォルトでは、DataNodeはラウンドロビンベースのポリシーを使用して新しいブロックを書き込みます。 しかし、長時間実行されているクラスタでは、HDFSでの大量のファイル削除やディスクホットスワップ機能による新しいDataNodeのディスクの追加などにより、DataNodeのディスクは極端に偏った使用状況になっている可能性があります。 たとえ、空き容量ベースのボリューム選択ポリシーを使用しても、ボリュームの不均衡は効率の悪いディスクI/Oにつながる可能性があります。たとえば、新しい書き込みがすべて新しく追加された空のディスクに行われ、その間他のディスクはアイドル状態になり、新しいディスクにボトルネックが生じます。

最近、Apache Hadoopコミュニティは、データの不均衡の問題を緩和するために(HDFS-1312, dev@ メーリングリスト、GitHub で説明されているように)サーバーのオフラインスクリプトを開発しました。しかし、HDFSコードベースの外にあるため、これらのスクリプトは、ディスク間でデータを移動する前にDataNodeをオフラインにする必要があります。 その結果、HDFS-1312は、さまざまなメトリックに基づいて実行中のDataNode上のボリュームのバランスをとるように設計されたオンラインディスクバランサも導入しています。 HDFSのバランサと同様に、HDFSディスクバランサはDataNode内のスレッドとして実行され、同じストレージタイプのボリューム間でブロックファイルを移動します。

この記事の残りの部分では、この新しい機能を使用する理由と使い方を学習します。

ディスクバランサ101

例を用いてこの便利な機能を段階的に調べてみましょう。 まず、すべてのDataNodeでdfs.disk.balancer.enabledの設定がtrueに設定されていることを確認します。 CDH 5.8.2以降では、Cloudera ManagerのHDFSの設定スニペットを使用してこの設定を指定できます。

この例では、事前にロードされたHDFSのDataNode(/mnt/disk1)にディスクを追加し、新しいディスクを/mnt/disk2にマウントします。 CDHでは、HDFSのそれぞれのデータディレクトリは別のディスク上にあるためdfを使用してディスク使用量を表示できます。

明らかに、もう一度ディスクバランスさせる時です!

通常ディスクバランサの処理には、hdfs diskbalancerコマンドによって実装されている3つのステップ、planexecutequeryがあります。 最初のステップでは、HDFSクライアントは実行計画を生成するために、指定されたDataNodeに関する必要な情報をNameNodeから読み込みます。

出力からわかるように、HDFSディスクバランサはDataNodeがNameNodeにレポートするディスク使用情報を使用して、指定されたDataNodeでデータ移動計画のステップを計算するためにプランナを使用します。 各ステップでは、データを移動するソースボリュームとターゲットボリューム、および移動が予想されるデータ量を明らかにします。

このブログの執筆時点では、HDFSでサポートされている唯一のプランナはGreedyPlannerであり、すべてのデータがすべてのデバイスに均等に分散されるまで、最も使用されているデバイスから最も使用されていないデバイスにデータが移動されます。 ユーザーは planコマンドで領域の使用率のしきい値を指定することもできます。 したがって、領域の使用率の差がしきい値を下回ると、プランナはディスクが均等になっていると判断します。 (もう1つの注目すべきオプションは、ディスクバランサI/Oが常のDataNodeのオペレーションに影響を与えないように、計画プロセス中に--bandwidthを指定することによって diskbalancerタスクのI/Oを抑制することです)。

ディスクバランサの実行計画は、HDFSに格納されるJSONファイルとして生成されます。デフォルトでは、計画ファイルは/system/diskbalancerディレクトリに保存されます。

DataNodeで計画を実行するには、以下を実行します。

このコマンドは、JSON計画ファイルをDataNodeに送信し、DataNodeはバックグラウンドのBlockMoverスレッドで実行します。

DataNode上のdiskbalancerタスクのステータスを確認するには queryコマンドを使用します。

出力(PLAN_DONE)は、ディスクバランシングタスクが完了したことを示します。 ディスクバランサの有効性を確認するには、再度df -hを使用して、2つのローカルディスク間のデータ配分を確認します。

出力は、ディスクバランサがボリューム間のディスクスペース使用率の差を10%以下に低減したことを裏付けています。 任務完了です!

HDFSディスクバランサの詳細については、 Clouderaのドキュメント(英語)とアップストリームのドキュメントを参照してください。

結論

HDFS-1312で紹介された待望のDataNodeディスク間バランサ機能が搭載されたことで、CDH 5.8.2以降に含まれるHDFSのバージョンでは、ノード(バランサ)、ストレージの種類(Mover)および単一のDataNode内のディスク(ディスクバランサ)にわたってデータを移動できる、包括的なストレージ容量管理ソリューションを提供しています。

謝辞

HDFS-1312は、HortonworksのAnu Engineer、Xiaobin Zhou、Arpit Agarwal、ClouderaのLei(Eddy)Xu、Manoj Govindasamyによって共同開発されました。

Leou XuはClouderaのソフトウェアエンジニア、Hadoopのコミッタ、Hadoop PMCのメンバーです。