HDFS DataNode 管理者ガイド

概要

Hadoop Distributed File System (HDFS) の NameNode は、すべての DataNode の状態を管理します。状態には2つの種類があります。1つ目は、ノードが稼働中か、停止中か、またはステールかを表す DataNode の存続状態です。2つ目は、ノードがサービス中か、デコミッション中か、またはメンテナンス中かを表す管理状態です。

管理者が DataNode をデコミッションすると、DataNode はまず `DECOMMISSION_INPROGRESS` 状態に移行します。その DataNode に属するすべてのブロックが、各ブロックのレプリケーションファクターに基づいて他の場所に完全にレプリケートされた後、DataNode は `DECOMMISSIONED` 状態に移行します。その後、管理者はノードをシャットダウンして、数日または数週間かかる可能性のある長期的な修復とメンテナンスを実行できます。マシンが修復された後、マシンはクラスタに再コミッションできます。

管理者は、短期的な修理/メンテナンスを実行するために、DataNode を数分/数時間だけ停止する必要がある場合があります。このようなシナリオでは、デコミッションによって発生する HDFS ブロックレプリケーションのオーバーヘッドは必要ない場合があり、軽量なプロセスが望ましいです。それが、メンテナンス状態が使用される理由です。管理者が DataNode をメンテナンス状態にすると、DataNode はまず `ENTERING_MAINTENANCE` 状態に移行します。その DataNode に属するすべてのブロックが他の場所に最低限レプリケートされている限り、DataNode はすぐに `IN_MAINTENANCE` 状態に移行します。メンテナンスが完了したら、管理者は DataNode をメンテナンス状態から解除できます。さらに、メンテナンス状態はタイムアウトをサポートしており、管理者は DataNode がメンテナンス状態を維持できる最長時間を設定できます。タイムアウト後、DataNode は人間の介入なしに HDFS によって自動的にメンテナンス状態から移行されます。

要約すると、DataNode の管理操作には以下が含まれます。

  • デコミッション
  • 再コミッション
  • ノードをメンテナンス状態にする
  • ノードをメンテナンス状態から解除する

そして、DataNode の管理状態には以下が含まれます。

  • `NORMAL` ノードはサービス中です。
  • `DECOMMISSIONED` ノードはデコミッションされています。
  • `DECOMMISSION_INPROGRESS` ノードは `DECOMMISSIONED` 状態に移行中です。
  • `IN_MAINTENANCE` ノードはメンテナンス状態です。
  • `ENTERING_MAINTENANCE` ノードはメンテナンス状態に移行中です。

ホストレベルの設定

DataNode の管理操作を実行するには、2つの手順があります。

  • ターゲット DataNode の目的の管理状態を示すホストレベルの設定ファイルを更新します。設定ファイルには、2つのサポートされている形式があります。

    • ホスト名のみの設定。各行には、DataNode のホスト名/IPアドレスが含まれます。これはデフォルトの形式です。
    • JSON ベースの設定。設定は JSON 形式です。各要素は 1 つの DataNode にマップされ、各 DataNode には複数のプロパティを含めることができます。この形式は、DataNode をメンテナンス状態にするために必要です。
  • NameNode にホストレベルの設定ファイルを再読み込みさせるには、次のコマンドを実行します。`hdfs dfsadmin [-refreshNodes]`

ホスト名のみの設定

これは NameNode によって使用されるデフォルトの設定です。ノードのデコミッションと再コミッションのみをサポートしており、メンテナンス状態に関連する管理操作はサポートしていません。hdfs-default.xmlで説明されているように、`dfs.hosts`と`dfs.hosts.exclude`を使用します。

次の例では、`host1`と`host2`はサービス中である必要があります。`host3`と`host4`はデコミッション状態である必要があります。

dfs.hosts ファイル

host1
host2
host3
host4

dfs.hosts.exclude ファイル

host3
host4

JSON ベースの設定

JSON ベースの形式は、DataNode で一般的なプロパティをサポートする新しい設定形式です。hdfs-default.xmlで説明されているように、次の設定を設定して JSON ベースの形式を有効にします。

設定
dfs.namenode.hosts.provider.classname org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
dfs.hosts json ホストファイルのパス

現在 HDFS でサポートされているプロパティのリストを次に示します。

プロパティ 説明
hostName 必須。DataNode のホスト名。
upgradeDomain オプション。DataNode のアップグレードドメインID。
adminState オプション。期待される管理状態。デフォルト値は `NORMAL` です。デコミッションの場合は `DECOMMISSIONED`、メンテナンス状態の場合は `IN_MAINTENANCE` です。
port オプション。DataNode のポート番号。
maintenanceExpireTimeInMS オプション。DataNode がメンテナンス状態を維持するミリ秒単位のエポック時間。デフォルト値は永遠です。

次の例では、`host1`と`host2`はサービス中である必要があります。`host3`はデコミッション状態である必要があります。`host4`はメンテナンス状態である必要があります。

dfs.hosts ファイル

[
  {
    "hostName": "host1"
  },
  {
    "hostName": "host2",
    "upgradeDomain": "ud0"
  },
  {
    "hostName": "host3",
    "adminState": "DECOMMISSIONED"
  },
  {
    "hostName": "host4",
    "upgradeDomain": "ud2",
    "adminState": "IN_MAINTENANCE"
  }
]

クラスタレベルの設定

DataNode の管理に関連するいくつかのクラスタレベルの設定があります。一般的なユースケースでは、デフォルト値を使用する必要があります。説明とデフォルト値については、hdfs-default.xmlを参照してください。

dfs.namenode.maintenance.replication.min
dfs.namenode.decommission.interval
dfs.namenode.decommission.blocks.per.interval
dfs.namenode.decommission.max.concurrent.tracked.nodes

バックオフデコミッションモニター(実験的)

元のデコミッションアルゴリズムには、多くのブロックを持つ DataNode がデコミッションされるときに問題があります。

  • NameNode の書き込みロックは、レプリケーションの再キューイングのために長時間保持される可能性があります。
  • 複数のデコミッション DataNode がある場合、レプリケーションの再作業はノードごとに進行します。

HDFS-14854 は、これらの問題を軽減するために新しいデコミッションモニターを導入しました。この機能は現在、実験的としてマークされており、デフォルトでは無効になっています。hdfs-site.xml で `dfs.namenode.decommission.monitor.class` の値を `org.apache.hadoop.hdfs.server.blockmanagement.DatanodeAdminBackoffMonitor` に設定して有効にすることができます。

関連する設定プロパティを以下の表に示します。説明とデフォルト値については、hdfs-default.xmlを参照してください。

プロパティ
dfs.namenode.decommission.monitor.class
dfs.namenode.decommission.backoff.monitor.pending.limit
dfs.namenode.decommission.backoff.monitor.pending.blocks.per.lock

メトリクス

管理状態は、NameNode の WebUI と JMX の一部です。HDFSCommands.htmlで説明されているように、次のコマンドを使用して管理状態を確認することもできます。

`dfsadmin`を使用して、クラスタレベルで管理状態を確認します。

hdfs dfsadmin -report

`fsck`を使用して、特定のパスにデータを格納している DataNode の管理状態を確認します。下位互換性のために、メンテナンス状態を返すには特別なフラグが必要です。

hdfs fsck <path> // only show decommission state
hdfs fsck <path> -maintenance // include maintenance state