HDFS DataNode 管理員指南

概觀

Hadoop 分散式檔案系統 (HDFS) 名稱節點維護所有資料節點的狀態。有兩種狀態類型。第一種類型描述資料節點的存活狀態,表示節點是存活、死亡或過時。第二種類型描述管理狀態,表示節點是正在服務中、已除役或正在維護中。

當管理員將資料節點停用時,資料節點將首先轉換為 DECOMMISSION_INPROGRESS 狀態。在所有屬於該資料節點的區塊都根據每個區塊的複製係數在其他地方完全複製後,資料節點將轉換為 DECOMMISSIONED 狀態。之後,管理員可以關閉節點以執行可能需要數天或數週的長期修復和維護。機器修復後,可以將機器重新委派回叢集。

有時管理員只需要將資料節點停用數分鐘/小時即可執行短期修復/維護。在這種情況下,停用所產生的 HDFS 區塊複製開銷可能不是必需的,並且需要一個輕量級的程序。這就是維護狀態的使用方式。當管理員將資料節點置於維護狀態時,資料節點將首先轉換為 ENTERING_MAINTENANCE 狀態。只要屬於該資料節點的所有區塊都在其他地方至少複製,資料節點將立即轉換為 IN_MAINTENANCE 狀態。維護完成後,管理員可以將資料節點移出維護狀態。此外,維護狀態支援逾時,允許管理員設定資料節點允許停留於維護狀態中的最長持續時間。逾時後,資料節點將在沒有人為干預的情況下自動由 HDFS 轉移出維護狀態。

總之,資料節點管理員操作包括以下內容

  • 停用
  • 重新委派
  • 將節點置於維護狀態
  • 將節點移出維護狀態

資料節點管理員狀態包括以下內容

  • NORMAL 節點正在服務中。
  • DECOMMISSIONED 節點已停用。
  • DECOMMISSION_INPROGRESS 節點正在轉換為 DECOMMISSIONED 狀態。
  • IN_MAINTENANCE 節點處於維護狀態。
  • ENTERING_MAINTENANCE 節點正在轉換為維護狀態。

主機層級設定

要執行任何資料節點管理員操作,有兩個步驟。

  • 更新主機層級設定檔以指出目標資料節點的所需管理員狀態。設定檔有兩種支援的格式。

    • 僅主機名組態。每一行包含資料節點的主機名/IP 位址。這是預設格式。
    • 基於 JSON 的組態。組態採用 JSON 格式。每個元素對應到一個資料節點,而每個資料節點可以有多個屬性。此格式是將資料節點置於維護狀態的必要條件。
  • 執行下列指令,讓名稱節點重新載入主機層級組態檔。hdfs dfsadmin [-refreshNodes]

僅主機名組態

這是名稱節點使用的預設組態。它僅支援節點解除服務和重新委任;它不支援與維護狀態相關的管理員操作。請依據 hdfs-default.xml 中的說明,使用 dfs.hostsdfs.hosts.exclude

在以下範例中,host1host2 需要在服務中。host3host4 需要在解除服務狀態中。

dfs.hosts 檔案

host1
host2
host3
host4

dfs.hosts.exclude 檔案

host3
host4

基於 JSON 的組態

基於 JSON 的格式是新的組態格式,它支援資料節點上的通用屬性。請依據 hdfs-default.xml 中的說明,設定下列組態,以啟用基於 JSON 的格式。

設定
dfs.namenode.hosts.provider.classname org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
dfs.hosts json 主機檔案的路徑

以下是 HDFS 目前支援的屬性清單。

屬性 說明
hostName 必要。資料節點的主機名稱。
upgradeDomain 選用。資料節點的升級網域 ID。
adminState 選用。預期的管理員狀態。預設值為 NORMAL;解除服務為 DECOMMISSIONED;維護狀態為 IN_MAINTENANCE
port 選用。資料節點的埠號
maintenanceExpireTimeInMS 選用。資料節點將維持在維護狀態的毫秒數紀元時間。預設值為永久。

在以下範例中,host1host2 需要在服務中。host3 需要在解除服務狀態中。host4 需要在維護狀態中。

dfs.hosts 檔案

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

叢集層級設定

有許多與資料節點管理相關的叢集層級設定。對於常見的使用案例,您應該依賴預設值。請參閱 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

遞減解除服務監控器 (實驗性質)

當具有大量區塊的資料節點解除服務時,原始的解除服務演算法有問題,例如

  • NameNode 中的寫入鎖定可能會長時間保持,以排隊重新複製。
  • 如果有多個停用的資料節點,則重新複製工作會逐節點進行。

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 檢查儲存在特定路徑中的資料節點的管理員狀態。為了向後相容性,需要一個特殊標記來傳回維護狀態。

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