このガイドでは、HDFSフェデレーション機能の概要と、フェデレーションクラスタの構成および管理方法について説明します。
HDFSには、主に2つの層があります。
以前のHDFSアーキテクチャでは、クラスタ全体で単一の 名前空間しか許可されていませんでした。その構成では、単一のネームノードが名前空間を管理します。HDFSフェデレーションは、HDFSに複数のネームノード/名前空間のサポートを追加することにより、この制限に対処します。
ネームサービスを水平方向にスケーリングするために、フェデレーションは複数の独立したネームノード/名前空間を使用します。ネームノードは連合されています。ネームノードは独立しており、互いに調整する必要はありません。データノードは、すべてのネームノードによってブロックの共通ストレージとして使用されます。各データノードは、クラスタ内のすべてのネームノードに登録します。データノードは、定期的なハートビートとブロックレポートを送信します。また、ネームノードからのコマンドも処理します。
ユーザーは、ViewFsを使用して、パーソナライズされた名前空間ビューを作成できます。ViewFsは、一部のUnix/Linuxシステムのクライアント側マウントテーブルに似ています。
ブロックプール
ブロックプールは、単一の名前空間に属するブロックのセットです。データノードは、クラスタ内のすべてのブロックプールのブロックを保存します。各ブロックプールは独立して管理されます。これにより、名前空間は他の名前空間と調整することなく、新しいブロックのブロックIDを生成できます。ネームノードに障害が発生しても、データノードがクラスタ内の他のネームノードにサービスを提供できなくなることはありません。
名前空間とそのブロックプールをまとめて、名前空間ボリュームと呼びます。これは、自己完結型の管理単位です。ネームノード/名前空間が削除されると、データノードの対応するブロックプールが削除されます。各名前空間ボリュームは、クラスタのアップグレード中にユニットとしてアップグレードされます。
ClusterID
ClusterID識別子は、クラスタ内のすべてのノードを識別するために使用されます。ネームノードがフォーマットされると、この識別子は提供されるか、自動的に生成されます。このIDは、クラスタに他のネームノードをフォーマットするために使用する必要があります。
フェデレーション構成は下位互換性があり、既存の単一ネームノード構成を 변경없이 작동させることができます。新しい構成は、クラスタ内のノードの種類に基づいて異なる構成をデプロイする必要なく、クラスタ内のすべてのノードが同じ構成を持つように設計されています。
フェデレーションは、新しいNameServiceID
抽象化を追加します。ネームノードとそれに対応するセカンダリ/バックアップ/チェックポインターノードはすべて、NameServiceIdに属します。単一の構成ファイルをサポートするために、ネームノードとセカンダリ/バックアップ/チェックポインターの構成パラメータには、NameServiceID
が付加されます。
手順1:構成にdfs.nameservices
パラメータを追加し、コンマ区切りのNameServiceIDのリストで構成します。これは、データノードがクラスタ内のネームノードを判別するために使用されます。
手順2:各ネームノードとセカンダリネームノード/バックアップノード/チェックポインターについて、対応するNameServiceID
が付加された次の構成パラメータを共通構成ファイルに追加します。
デーモン | 構成パラメータ |
---|---|
ネームノード | dfs.namenode.rpc-address dfs.namenode.servicerpc-address dfs.namenode.http-address dfs.namenode.https-address dfs.namenode.keytab.file dfs.namenode.name.dir dfs.namenode.edits.dir dfs.namenode.checkpoint.dir dfs.namenode.checkpoint.edits.dir |
セカンダリネームノード | dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file |
バックアップノード | dfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
2つのネームノードを使用した構成例を次に示します。
<configuration> <property> <name>dfs.nameservices</name> <value>ns1,ns2</value> </property> <property> <name>dfs.namenode.rpc-address.ns1</name> <value>nn-host1:rpc-port</value> </property> <property> <name>dfs.namenode.http-address.ns1</name> <value>nn-host1:http-port</value> </property> <property> <name>dfs.namenode.secondary.http-address.ns1</name> <value>snn-host1:http-port</value> </property> <property> <name>dfs.namenode.rpc-address.ns2</name> <value>nn-host2:rpc-port</value> </property> <property> <name>dfs.namenode.http-address.ns2</name> <value>nn-host2:http-port</value> </property> <property> <name>dfs.namenode.secondary.http-address.ns2</name> <value>snn-host2:http-port</value> </property> .... Other common configuration ... </configuration>
手順1:次のコマンドを使用して、ネームノードをフォーマットします。
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
環境内の他のクラスタと競合しない一意のcluster_idを選択します。cluster_idが指定されていない場合は、一意のcluster_idが自動的に生成されます。
手順2:次のコマンドを使用して、追加のネームノードをフォーマットします。
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
手順2のcluster_idは、手順1のcluster_idと同じである必要があります。異なる場合、追加のネームノードはフェデレーションクラスタの一部になりません。
古いリリースでは、単一のネームノードのみがサポートされています。フェデレーションを有効にするには、クラスタを新しいリリースにアップグレードします。アップグレード中に、次のようにClusterIDを指定できます。
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>
cluster_idが指定されていない場合は、自動的に生成されます。
次の手順を実行します。
構成にdfs.nameservices
を追加します。
NameServiceIDサフィックスを使用して構成を更新します。リリース0.20以降、構成キー名が変更されました。フェデレーションを使用するには、新しい構成パラメータ名を使用する必要があります。
新しいネームノード関連の構成を構成ファイルに追加します。
構成ファイルをクラスタ内のすべてのノードに伝播します。
新しいネームノードとセカンダリ/バックアップを起動します。
クラスタ内のすべてのデータノードに対して次のコマンドを実行することにより、新しく追加されたネームノードを取得するようにデータノードを更新します。
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_ipc_port>
クラスタを起動するには、次のコマンドを実行します。
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
クラスタを停止するには、次のコマンドを実行します。
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
これらのコマンドは、HDFS設定が利用可能な任意のノードから実行できます。コマンドは設定を使用してクラスタ内のネームノードを特定し、それらのノードでネームノードプロセスを開始します。データノードは、workers
ファイルで指定されたノードで開始されます。このスクリプトは、クラスタを起動および停止するための独自のスクリプトを作成するための参考として使用できます。
バランサーは、複数のネームノードで動作するように変更されました。バランサーは、次のコマンドを使用して実行できます。
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]
ポリシーパラメータには、次のいずれかを指定できます。
datanode
- これは*デフォルト*のポリシーです。これは、データノードレベルでストレージのバランスを取ります。これは、以前のリリースのバランス調整ポリシーに似ています。
blockpool
- これは、ブロックプールレベルでストレージのバランスを取り、データノードレベルでもバランスを取ります。
バランサーはデータのバランスのみを取り、名前空間のバランスは取らないことに注意してください。完全なコマンドの使用法については、balancerを参照してください。
デコミッショニングは、以前のリリースと同様です。デコミッショニングする必要のあるノードは、すべてのネームノードのexcludeファイルに追加されます。各ネームノードは、独自のブロックプールをデコミッショニングします。すべてのネームノードがデータノードのデコミッショニングを完了すると、データノードはデコミッショニングされたと見なされます。
ステップ1:excludeファイルをすべてのネームノードに配布するには、次のコマンドを使用します。
[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>
ステップ2:すべてのネームノードを更新して、新しいexcludeファイルを取得します。
[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh
上記のコマンドは、HDFS設定を使用して、クラスタ内で設定されているネームノードを特定し、それらを更新して新しいexcludeファイルを取得します。
ネームノードのステータスWebページと同様に、フェデレーションを使用する場合、フェデレーションされたクラスタを監視するためのクラスタWebコンソールがhttp://<any_nn_host:port>/dfsclusterhealth.jsp
で利用できます。クラスタ内の任意のネームノードを使用して、このWebページにアクセスできます。
クラスタWebコンソールは、次の情報を提供します。
クラスタ全体のファイル数、ブロック数、設定済みストレージ容量の合計、および使用可能なストレージと使用済みストレージを示すクラスタサマリー。
ネームノードのリストと、各ネームノードのファイル数、ブロック数、欠落ブロック数、および稼働中および停止中のデータノードを含むサマリー。また、各ネームノードのWeb UIにアクセスするためのリンクも提供します。
データノードのデコミッショニングステータス。