Hadoop 3.x 新特性剖析系列2
1.概述
接著上一篇博客的內容,繼續介紹Hadoop3的其他新特性。其內容包含:優化Hadoop Shell腳本、重構Hadoop Client Jar包、支持等待Container、MapReduce任務級別本地優化、支持多個NameNode、部分默認服務端口被改變、支持文件系統連接器、DataNode內部添加負載均衡、重構後臺程序和任務堆管理。
2.內容
2.2.1 優化Hadoop Shell腳本
Hadoop Shell腳本已經被重寫,用來修復已知的BUG,解決兼容性問題和一些現有安裝的更改。它還包含了一些新的特性,內容如下所示:
- 所有Hadoop Shell腳本子系統現在都會執行hadoop-env.sh這個腳本,它允許所有環節變量位於一個位置;
- 守護進程已通過*-daemon.sh選項從*-daemon.sh移動到了bin命令中,在Hadoop3中,我們可以簡單的使用守護進程來啟動、停止對應的Hadoop系統進程;
- 觸發SSH連接操作現在可以在安裝時使用PDSH;
- ${HADOOP_CONF_DIR}現在可以任意配置到任何地方;
- 腳本現在測試並報告守護進程啟動時日誌和進程ID的各種狀態;
2.2.2 重構Hadoop Client Jar包
Hadoop2 中可用的Hadoop客戶端將Hadoop的傳遞依賴性拉到Hadoop應用程序的類路徑上。如果這些傳遞依賴項的版本與應用程序使用的版本發送沖突,這可能會產生問題。
因此,在Hadoop3中有新的Hadoop客戶端API和Hadoop客戶端運行時工件,它們將Hadoop的依賴性遮蔽到單個JAR中,Hadoop客戶端API是編譯範圍,Hadoop客戶端運行時是運行時範圍,它包含從Hadoop客戶端重新定位的第三方依賴關系。因此,你可以將依賴項綁定到JAR中,並測試整個JAR以解決版本沖突。這樣避免了將Hadoop的依賴性泄露到應用程序的類路徑上。例如,HBase可以用來與Hadoop集群進行數據交互,而不需要看到任何實現依賴。
2.2.3 支持等待容器和分布式調度
在Hadoop3 中引入了一種新型執行類型,即等待容器,即使在調度時集群沒有可用的資源,它也可以在NodeManager中被調度執行。在這種情況下,這些容器將在NM中排隊等待資源啟動,等待榮容器比默認容器優先級低,因此,如果需要,可以搶占默認容器的空間,這樣可以提供機器的利用率。如下圖所示:
默認容器對於現有的YARN容器,它們由容量調度分配,一旦被調度到節點,就保證有可用的資源使它們執行立即開始。此外,只要沒有故障發生,這些容器就可以允許完畢。
等待容器默認由中心RM分配,但還增加了支持以允許等待容器被分布式調度,該調度群被實現於AM和RM協議的攔截器。
2.2.4 MapReduce任務級別本地化優化
在Hadoop3中,本地的Java實現已加入MapReduce地圖輸出器,對於Shuffle密集的作業,這樣可以提高30%或者更高的性能。
它們添加了映射輸出收集器的本機實現,讓MapTask基於JNI來本機優化。基本思想是添加一個NativeMapOutputCollector收集器來處理映射器發出的鍵值對,因此Sort、Spill、文件序列化都可以在本機代碼中完成。
2.2.5 支持多個NameNode節點
在Hadoop2中,HDFS NameNode高可用體系結構有一個Active和Standby NameNode,通過JournalNodes,該體系結構能夠容忍任何一個NameNode失敗。
然而,業務關鍵部署需要更高程度的容錯性。因此,在Hadoop3中允許用戶運行多個備用的NameNode。例如,通過配置三個NameNode(1個Active NameNode和2個Standby NameNode)和5個JournalNodes節點,集群可以容忍2個NameNode節點故障。如下圖所示:
2.2.6 默認的服務端口被修改
早些時候,多個Hadoop服務的默認端口位於Linux端口範圍以內。除非客戶端程序明確的請求特定的端口號,否則使用的端口號是臨時的,因此,在啟動時,服務有時會因為與其他另一個應用程序沖突而無法綁定到端口。
因此,具有臨時範圍沖突端口已經被移除該範圍,影響多個服務的端口號,即NameNode、Secondary NameNode、DataNode等如下所示:
Daemon | App | Hadoop2 Port | Hadoop3 Port |
NameNode Port | Hadoop HDFS NameNode | 8020 | 9820 |
Hadoop HDFS NameNode HTTP UI | 50070 | 9870 | |
Hadoop HDFS NameNode HTTPS UI | 50470 | 9871 | |
Secondary NameNode Port | Secondary NameNode HTTP | 50091 | 9869 |
Secondary NameNode HTTP UI | 50090 | 9868 | |
DataNode Port | Hadoop HDFS DataNode IPC | 50020 | 9867 |
Hadoop HDFS DataNode | 50010 | 9866 | |
Hadoop HDFS DataNode HTTP UI | 50075 | 9864 | |
Hadoop HDFS DataNode HTTPS UI | 50475 | 9865 |
2.2.6 支持文件系統連接器
Hadoop現在支持與微軟 Azure數據和阿裏雲對象存儲系統的集成。它可以作為一種替代Hadoop兼容的文件系統,首先添加微軟Azure數據,然後添加阿裏雲對象存儲系統。
2.2.7 DataNode內部負載均衡
單個數據節點配置多個數據磁盤,在正常寫入操作期間,數據被均勻的劃分,因此,磁盤被均勻填充。但是,在維護磁盤時,添加或者替換磁盤會導致DataNode節點存儲出現偏移,這種情況在早期的HDFS文件系統中,是沒有被處理的。如圖下圖所示,維護前和維護後不均衡的情況:
現在Hadoop3通過新的內部DataNode平衡功能來處理這種情況,這是通過hdfs diskbalancer CLI來進行調用的。執行之後,DataNode會進行均衡處理,如下圖所示:
2.2.8 重構後臺程序和任務堆管理
Hadoop守護進程和MapReduce任務的堆管理已經發生了一系列的變化。
- 配置守護進程堆大小的新方法:值得註意的是,現在可以根據主機的內存大小進行自動調整,並且已經禁止HADOOP_HEAPSIZE變量。在HADOOP\_HEAPSIZE\_MAX 和 HADOOP\_HEAPSIZE\_MIN位置上,分別設置XMX和XMS。所有全局和守護進程特定堆大小變量現在都支持單元。如果變量僅為一個數,它的大小為MB。
- Map和Reduce的堆大小的配置被簡化了,所以不再需要任務配置作為一個Java選項指定。已經指定的兩個現有配置不受此更改的影響。
3.總結
Hadoop3的這些新特性還是很吸引人的,目前官方推出的穩定版本是2.9.0,發行版是3.1.0,感興趣的同學可以下載Hadoop3去體驗調研學習一下這些新特性。
4.結束語
這篇博客就和大家分享到這裏,如果大家在研究學習的過程當中有什麽問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉!
Hadoop 3.x 新特性剖析系列2