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 の管理状態には以下が含まれます。
DataNode の管理操作を実行するには、2つの手順があります。
ターゲット DataNode の目的の管理状態を示すホストレベルの設定ファイルを更新します。設定ファイルには、2つのサポートされている形式があります。
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 ベースの形式は、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 がデコミッションされるときに問題があります。
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