HDFS系列之DataNode磁碟管理解析及實踐!
在單一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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 原始碼|HDFS之DataNode:啟動過程原始碼
- 原始碼|HDFS之DataNode:寫資料塊(2)原始碼
- 原始碼|HDFS之DataNode:寫資料塊(3)原始碼
- 原始碼|HDFS之DataNode:寫資料塊(1)原始碼
- ASM之磁碟建立及管理ASM
- Hadoop 學習系列(二)之 HDFS 詳細解析Hadoop
- HDFS原始碼解析系列一——HDFS通訊協議原始碼協議
- 學生資訊管理系統解析之介面實踐篇
- Zookeeper和Curator-Framework實踐系列之: 配置管理Framework
- hadoop原始碼_hdfs啟動流程_2_DataNodeHadoop原始碼
- 深入解析Immutable及 React 中實踐React
- 事務管理最佳實踐全面解析
- 管理實踐之輔導
- 大資料專案實踐(一)——之HDFS叢集配置大資料
- Hadoop系列之HDFS 資料塊Hadoop
- Serverless 架構落地實踐及案例解析Server架構
- Pisa-Proxy 之 SQL 解析實踐SQL
- Redis原理及實踐之GeoHashRedis
- dart系列之:集合使用最佳實踐Dart
- PHP最佳實踐系列之標準PHP
- HDFS EC在B站的實踐
- HDFS分散式儲存中NameNode 和DataNode 有什麼區別?分散式
- Java 8 記憶體管理原理解析及記憶體故障排查實踐Java記憶體
- 解析 Nebula Graph 子圖設計及實踐
- 淺談:前端路由原理解析及實踐前端路由
- Hadoop入門(二)之 HDFS 詳細解析Hadoop
- hadoop之 解析HDFS的寫檔案流程Hadoop
- dart系列之:dart程式碼最佳實踐Dart
- HDFS分散式儲存的意義及技術解析分散式
- Hadoop大資料實戰系列文章之HDFS檔案系統Hadoop大資料
- vivo 萬臺規模 HDFS 叢集升級 HDFS 3.x 實踐
- HDFS3.2升級在滴滴的實踐S3
- App磁碟沙盒工具實踐APP
- Solaris使用與管理之實踐(Day 1)
- HDFS免重啟掛載新磁碟
- Oracle 11gR2 ASM磁碟組管理與新特性實踐[1]OracleASM
- Android動態換膚原理解析及實踐Android
- 理論+實踐解析“IT治理”之模式與原則模式