HDFS系列之DataNode磁碟管理解析及實踐!

趙鈺瑩發表於2018-08-13

在單一DataNode管理多個磁碟的情況下,執行普通寫操作時的每個磁碟用量比較平均。但是,新增或者更換磁碟將會導致DataNode磁碟用量嚴重不均衡,傳統的HDFS均衡器關注點是DataNode之間(inter-)而不是intra-,但是Hadoop 3.0及以上版本中,新的HDFS Intra-DataNode磁碟平衡器可以很好得解決上述問題。

HDFS現在包括(在CDH 5.8.2及更高版本中提供)全面的儲存容量管理方法,用於跨節點移動資料。熟悉Hadoop簡單配置的同學應該都知道hdfs-site.xml,在HDFS中,DataNode將資料塊擴充套件到本地檔案系統目錄,可以使用hdfs-site.xml中的dfs.datanode.data.dir指定。在一個典型的安裝過程中,每個目錄(在HDFS術語中稱作卷)位於不同的裝置上(例如,在單獨的HDD和SSD上)。

當我們將新塊寫入HDFS時,DataNode使用卷選擇策略為塊選擇磁碟。目前支援兩種策略型別:輪詢(round-robin)和可用空間(available space)(HDFS-1804)。

簡而言之,如上圖所示,輪詢策略在可用磁碟上均勻分配新塊,而可用空間策略優先將資料寫入具有最多可用空間(按百分比)的磁碟。

預設情況下,DataNode使用基於輪詢的策略來編寫新塊。但是,在長時間執行的叢集中,由於HDFS中的大量檔案刪除或通過磁碟熱交換功能新增新的DataNode磁碟等事件,DataNode仍然可能建立了顯著不平衡的卷。即使使用基於可用空間的卷選擇策略,卷不平衡現象仍然會導致磁碟I/O效率降低:例如,每個新的寫入都轉到新新增的空磁碟而其他磁碟空閒,這會給新磁碟造成瓶頸。

Apache Hadoop社群開發了伺服器離線指令碼以緩解資料不平衡問題。但是,由於在HDFS程式碼庫之內,這些指令碼要求DataNode在磁碟間移動資料前處於離線狀態。因此,HDFS-1312引入了線上磁碟平衡器,旨在根據各種指標重新平衡正在執行的DataNode上的卷。與HDFS Balancer類似,HDFS磁碟平衡器作為DataNode中的執行緒執行,以跨具有相同儲存型別的卷移動塊檔案。

磁碟平衡器101

讓我們使用示例逐步探索該功能。首先,確認所有DataNode上的dfs.disk.balancer.enabled配置都設定為true。從CDH 5.8.2開始,使用者可以通過Cloudera Manager中的HDFS安全閥片段指定此配置:

在此示例中,我們將向預載入的HDFS DataNode(/ mnt / disk1)新增新磁碟,並將新磁碟裝入/mnt/disk2。在CDH中,每個HDFS資料目錄都在一個單獨的磁碟上,因此使用者可以使用df來顯示磁碟使用情況:

# df -h …. /var/disk1      5.8G  3.6G  1.9G  66% /mnt/disk1 /var/disk2      5.8G   13M  5.5G   1% /mnt/disk2

顯然,是時候讓磁碟再次平衡!傳統的磁碟平衡器任務涉及三個步驟(通過HDFS diskbalancer命令實現):計劃,執行和查詢。在第一步中,HDFS客戶端從NameNode讀取有關指定DataNode的必要資訊,以生成執行計劃:

# hdfs diskbalancer -plan lei-dn-3.example.org 16/08/19 18:04:01 INFO planner.GreedyPlanner: Starting plan for Node : lei-dn-3.example.org:20001 16/08/19 18:04:01 INFO planner.GreedyPlanner: Disk Volume set 03922eb1-63af-4a16-bafe-fde772aee2fa Type : DISK plan completed.Th 16/08/19 18:04:01 INFO planner.GreedyPlanner: Compute Plan for Node : lei-dn-3.example.org:20001 took 5 ms 16/08/19 18:04:01 INFO command.Command: Writing plan to : /system/diskbalancer/2016-Aug-19-18-04-01

從輸出中可以看出,HDFS 磁碟平衡器通過資料節點將磁碟使用資訊報告給NameNode,並計算指定DataNode上的資料移動步驟。每個步驟都指定要移動資料的源卷和目標卷,以及預期要移動的資料量。

在撰寫本文時,HDFS支援的唯一規劃器是GreedyPlanner,它不斷地將資料從最常用的裝置移動到最少使用的裝置,直到所有資料均勻分佈在所有裝置上。使用者還可以在plan命令中指定空間利用率的閾值,如果空間利用率的差異低於閾值,則規劃人員會認為磁碟是平衡的。(另一個值得注意的選擇是通過在規劃過程中指定--bandwidth來限制磁碟平衡器任務I / O,以免磁碟平衡器I/O影響前臺工作。)

磁碟平衡器執行計劃生成為儲存在HDFS中的JSON檔案。預設情況下,計劃檔案儲存在/system/diskbalancer目錄中:

# hdfs dfs -ls /system/diskbalancer/2016-Aug-19-18-04-01 Found 2 items -rw-r--r--   3 hdfs supergroup       1955 2016-08-19 18:04 /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.before.json -rw-r--r--   3 hdfs supergroup        908 2016-08-19 18:04 /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.plan.json

要在DataNode上執行計劃,請執行:

$ hdfs diskbalancer -execute /system/diskbalancer/2016-Aug-17-17-03-56/172.26.10.16.plan.json 16/08/17 17:22:08 INFO command.Command: Executing "execute plan" command

此命令用於將JSON計劃檔案提交給DataNode,後者在BlockMoverthread執行緒的後臺執行。

要檢查DataNode上diskbalancer任務的狀態,請使用query命令:

# hdfs diskbalancer -query lei-dn-3:20001 16/08/19 21:08:04 INFO command.Command: Executing "query plan" command. Plan File: /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.plan.json Plan ID: ff735b410579b2bbe15352a14bf001396f22344f7ed5fe24481ac133ce6de65fe5d721e223b08a861245be033a82469d2ce943aac84d9a111b542e6c63b40e75 Result: PLAN_DONE

輸出(PLAN_DONE)表示磁碟平衡任務已完成。如果要驗證磁碟平衡器的有效性,可以再次使用df -h檢視跨兩個本地磁碟的資料分佈情況:

# df -h Filesystem      Size  Used Avail Use% Mounted on …. /var/disk1      5.8G  2.1G  3.5G  37% /mnt/disk1 /var/disk2      5.8G  1.6G  4.0G  29% /mnt/disk2

只要輸出確認磁碟平衡器成功地將磁碟空間使用量差異減少到10%以下,那就意味著任務完成了。

結論

憑藉HDFS-1312中的DataNode內部磁碟平衡器功能,CDH 5.8.2及更高版本中的HDFS提供了一個全面的儲存容量管理解決方案,該解決方案能夠跨越節點(balancer),儲存型別(mover), 在單個DataNode的磁碟(Disk Balancer)移動資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2199954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章