目前的 HDFS 預設區塊配置政策保證區塊的 3 個複本將放置在至少 2 個機架上。具體來說,在寫入管線期間,一個複本放置在一個機架上,而其他兩個複本放置在另一個機架上。這是機架多樣性和寫入管線效率之間的良好折衷。請注意,後續的負載平衡或機器成員資格變更可能會導致區塊的 3 個複本分佈在 3 個不同的機架上。因此,不同機架中的任何 3 個資料節點都可以儲存區塊的 3 個複本。
但是,預設配置政策會影響我們執行資料節點滾動升級的方式。HDFS 滾動升級文件說明了如何在不中斷服務的情況下以滾動方式升級資料節點。由於不同機架中的任何 3 個資料節點都可以儲存區塊的所有複本,因此必須一次重新啟動一個資料節點,以最大程度地降低對資料可用性和讀寫操作的影響。一次升級一個機架是另一個選項;但是,如果在升級期間另一個機架發生機器故障,這將增加資料不可用的機率。
這種順序資料節點滾動升級策略的副作用是較大型叢集的升級時間較長。
為了解決滾動升級中區塊配置原則的限制,已透過新的區塊配置原則將升級網域的概念新增至 HDFS。這個概念會在現有的機架群組之外,將資料節點分組至稱為升級網域的新維度中。例如,我們可以將任何機架的第一個位置中的所有資料節點指定至升級網域 ud_01,將第二個位置中的節點指定至升級網域 ud_02,以此類推。
除了預設的區塊配置原則外,名稱節點還提供 BlockPlacementPolicy 介面,以支援任何自訂的區塊配置。HDFS 中提供了基於此介面的新升級網域區塊配置原則。它會確保任何特定區塊的複本會分佈在來自不同升級網域的機器上。預設情況下,任何特定區塊的 3 個複本會配置在 3 個不同的升級網域上。這表示屬於特定升級網域的所有資料節點在總體上不會儲存超過任何區塊的一個複本。
透過實施升級網域區塊配置原則,我們可以同時升級屬於一個升級網域的所有資料節點,而不會影響資料可用性。只有在完成一個升級網域的升級後,我們才會移至下一個升級網域,直到所有升級網域都已升級為止。此程序將確保任何特定區塊的兩個複本不會同時升級。這表示我們可以同時升級大型叢集中的許多機器。而且,隨著叢集持續擴充,新的機器會新增至現有的升級網域,而不會影響升級的並行性。
對於使用預設區塊配置原則的現有叢集,在切換至新的升級網域區塊配置原則後,任何新建立的區塊都將符合新的原則。根據舊原則配置的舊區塊需要移轉至新的原則。您可以使用移轉工具。請參閱 HDFS-8789 以取得詳細資料。
若要為您的叢集啟用升級網域,請執行下列步驟
資料節點如何對應至升級網域 ID 是由管理員定義的,且特定於叢集配置。一種常見的方式是使用機器的機架位置作為其升級網域 ID。
若要設定從主機名稱至其升級網域 ID 的對應,我們需要使用基於 json 的主機設定檔。透過設定下列屬性,如 hdfs-default.xml 中所述。
設定 | 值 |
---|---|
dfs.namenode.hosts.provider.classname |
org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts |
json 主機檔案路徑 |
json 主機檔案定義所有主機的屬性。在以下範例中,有 2 個機架中的 4 個資料節點;機架位置 01 中的機器屬於升級網域 01;機架位置 02 中的機器屬於升級網域 02。
[ { "hostName": "dcArackA01", "upgradeDomain": "01" }, { "hostName": "dcArackA02", "upgradeDomain": "02" }, { "hostName": "dcArackB01", "upgradeDomain": "01" }, { "hostName": "dcArackB02", "upgradeDomain": "02" } ]
在每個資料節點都已指定升級網域 ID 之後,下一步是啟用升級網域區塊配置政策,其設定如下,如 hdfs-default.xml 中所述。
設定 | 值 |
---|---|
dfs.block.replicator.classname |
org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithUpgradeDomain |
在重新啟動名稱節點後,新的政策將用於任何新的區塊配置。
如果您變更現有叢集的區塊配置政策,您需要確認在區塊配置政策變更之前配置的區塊符合新的區塊配置政策。
HDFS-8789 提供了用戶端移轉工具的初始草稿修補程式。在提交工具後,我們將能夠說明如何使用該工具。
在叢集管理期間,我們可能需要重新啟動資料節點以選取新的設定、新的 Hadoop 版本或 JVM 版本等。在啟用升級網域且叢集上的所有區塊都符合新政策的情況下,我們現在可以一次重新啟動一個升級網域,以批次方式重新啟動資料節點。無論是手動程序或透過自動化,步驟如下
升級網域是名稱節點 JMX 的一部分。如 HDFSCommands.html 中所述,您也可以使用下列指令驗證升級網域。
使用 dfsadmin
檢查叢集層級的升級網域。
hdfs dfsadmin -report
使用 fsck
檢查儲存特定路徑資料的資料節點的升級網域。
hdfs fsck <path> -files -blocks -upgradedomains