HDFS フェデレーション

このガイドでは、HDFSフェデレーション機能の概要と、フェデレーションクラスタの構成および管理方法について説明します。

背景

HDFS Layers

HDFSには、主に2つの層があります。

  • 名前空間
    • ディレクトリ、ファイル、およびブロックで構成されます。
    • ファイルとディレクトリの作成、削除、変更、一覧表示など、名前空間に関連するすべてのファイルシステム操作をサポートします。
  • ブロックストレージサービス。これは2つの部分で構成されます。
    • ブロック管理(ネームノードで実行)
      • 登録と定期的なハートビートを処理することにより、データノードクラスタのメンバーシップを提供します。
      • ブロックレポートを処理し、ブロックの場所を維持します。
      • ブロックの作成、削除、変更、ブロックの場所の取得など、ブロック関連の操作をサポートします。
      • レプリカの配置、複製数が不足しているブロックのブロック複製を管理し、複製数が過剰なブロックを削除します。
    • ストレージ - ローカルファイルシステムにブロックを保存し、読み取り/書き込みアクセスを許可することにより、データノードによって提供されます。

    以前のHDFSアーキテクチャでは、クラスタ全体で単一の 名前空間しか許可されていませんでした。その構成では、単一のネームノードが名前空間を管理します。HDFSフェデレーションは、HDFSに複数のネームノード/名前空間のサポートを追加することにより、この制限に対処します。

複数のネームノード/名前空間

ネームサービスを水平方向にスケーリングするために、フェデレーションは複数の独立したネームノード/名前空間を使用します。ネームノードは連合されています。ネームノードは独立しており、互いに調整する必要はありません。データノードは、すべてのネームノードによってブロックの共通ストレージとして使用されます。各データノードは、クラスタ内のすべてのネームノードに登録します。データノードは、定期的なハートビートとブロックレポートを送信します。また、ネームノードからのコマンドも処理します。

ユーザーは、ViewFsを使用して、パーソナライズされた名前空間ビューを作成できます。ViewFsは、一部のUnix/Linuxシステムのクライアント側マウントテーブルに似ています。

HDFS Federation Architecture

ブロックプール

ブロックプールは、単一の名前空間に属するブロックのセットです。データノードは、クラスタ内のすべてのブロックプールのブロックを保存します。各ブロックプールは独立して管理されます。これにより、名前空間は他の名前空間と調整することなく、新しいブロックのブロック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が指定されていない場合は、自動的に生成されます。

既存のHDFSクラスタへの新しいネームノードの追加

次の手順を実行します。

  • 構成に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ページと同様に、フェデレーションを使用する場合、フェデレーションされたクラスタを監視するためのクラスタWebコンソールがhttp://<any_nn_host:port>/dfsclusterhealth.jspで利用できます。クラスタ内の任意のネームノードを使用して、このWebページにアクセスできます。

クラスタWebコンソールは、次の情報を提供します。

  • クラスタ全体のファイル数、ブロック数、設定済みストレージ容量の合計、および使用可能なストレージと使用済みストレージを示すクラスタサマリー。

  • ネームノードのリストと、各ネームノードのファイル数、ブロック数、欠落ブロック数、および稼働中および停止中のデータノードを含むサマリー。また、各ネームノードのWeb UIにアクセスするためのリンクも提供します。

  • データノードのデコミッショニングステータス。