Hadoop 3.x 與Hadoop 2.x 的區別和優化點
通用性
1.精簡Hadoop內核,包括剔除過期的API和實現,將默認組件實現替換成最高效的實現(比如將FileOutputCommitter缺省實現換為v2版本,廢除hftp轉由webhdfs替代,移除Hadoop子實現序列化庫org.apache.hadoop.Records。
2.Classpath isolation:以防止不同版本jar包沖突,比如google Guava在混合使用Hadoop、HBase和Spark時,很容易產生沖突。
3.Shell腳本重構: Hadoop 3.0對Hadoop的管理腳本進行了重構,修復了大量bug,增加了新特性,支持動態命令等。
Hadoop HDFS
Hadoop3.x中Hdfs在可靠性和支持能力上作出很大改觀:
1.HDFS支持數據的擦除編碼,這使得HDFS在不降低可靠性的前提下,節省一半存儲空間。
2.多NameNode支持,即支持一個集群中,一個active、多個standby namenode部署方式。注:多ResourceManager特性在hadoop 2.0中已經支持。
Hadoop MapReduce
Hadoop3.X中的MapReduce較之前的版本作出以下更改:
1.Tasknative優化:為MapReduce增加了C/C++的map output collector實現(包括Spill,Sort和IFile等),通過作業級別參數調整就可切換到該實現上。對於shuffle密集型應用,其性能可提高約30%。
2.MapReduce內存參數自動推斷。在Hadoop 2.0中,為MapReduce作業設置內存參數非常繁瑣,涉及到兩個參數:mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts
一旦設置不合理,則會使得內存資源浪費嚴重,比如將前者設置為4096MB,但后者卻是“-Xmx2g”,則剩余2g實際上無法讓java heap使用到。
Yarn
Yarn Timeline Service V2提供一個通用的應用程序共享信息和共享存儲模塊。可以將metrics等信息保存。
可以實現分布式writer實例和一個可伸縮的存儲模塊。同時,v2版本在穩定性和性能上面也做出了提升,原先版本不適用於大集群,v2版本使用hbase取代了原先的leveldb作為后台的存儲工具。
HDFS糾刪碼
在Hadoop3.X中,HDFS實現了Erasure Coding這個新功能。Erasure coding糾刪碼技術簡稱EC,是一種數據保護技術.最早用於通信行業中數據傳輸中的數據恢復,是一種編碼容錯技術。
它通過在原始數據中加入新的校驗數據,使得各個部分的數據產生關聯性。在一定范圍的數據出錯情況下,通過糾刪碼技術都可以進行恢復。
hadoop-3.0之前,HDFS存儲方式為每一份數據存儲3份,這也使得存儲利用率僅為1/3,hadoop-3.0引入糾刪碼技術(EC技術),實現1份數據+0.5份冗余校驗數據存儲方式。
與副本相比糾刪碼是一種更節省空間的數據持久化存儲方法。標准編碼(比如Reed-Solomon(10,4))會有1.4 倍的空間開銷;然而HDFS副本則會有3倍的空間開銷。
因為糾刪碼額外開銷主要是在重建和執行遠程讀,它傳統用於存儲冷數據,即不經常訪問的數據。當部署這個新特性時用戶應該考慮糾刪碼的網絡和CPU 開銷。
MapReduce優化
Hadoop3.x中的MapReduce添加了Map輸出collector的本地實現,對於shuffle密集型的作業來說,這將會有30%以上的性能提升。
支持多個NameNodes
最初的HDFS NameNode high-availability實現僅僅提供了一個active NameNode和一個Standby NameNode;並且通過將編輯日志復制到三個JournalNodes上,這種架構能夠容忍系統中的任何一個節點的失敗。
然而,一些部署需要更高的容錯度。我們可以通過這個新特性來實現,其允許用戶運行多個Standby NameNode。比如通過配置三個NameNode和五個JournalNodes,這個系統可以容忍2個節點的故障,而不是僅僅一個節點。
默認端口更改
在hadoop3.x之前,多個Hadoop服務的默認端口都屬於Linux的臨時端口范圍(32768-61000)。這就意味着用戶的服務在啟動的時候可能因為和其他應用程序產生端口沖突而無法啟動。
現在這些可能會產生沖突的端口已經不再屬於臨時端口的范圍,這些端口的改變會影響NameNode, Secondary NameNode, DataNode以及KMS。與此同時,官方文檔也進行了相應的改變,具體可以參見 HDFS-9427以及HADOOP-12811。
Namenode ports: 50470 --> 9871, 50070--> 9870, 8020 --> 9820
Secondary NN ports: 50091 --> 9869,50090 --> 9868
Datanode ports: 50020 --> 9867, 50010--> 9866, 50475 --> 9865, 50075 --> 9864
Kms server ports: 16000 --> 9600 (原先的16000與HMaster端口沖突)
數據節點均衡器
一個DataNode可以管理多個磁盤,正常寫入操作,各磁盤會被均勻填滿。然而,當添加或替換磁盤時可能導致此DataNode內部的磁盤存儲的數據嚴重內斜。
這種情況現有的HDFS balancer是無法處理的。這種情況是由新intra-DataNode平衡功能來處理,通過hdfs diskbalancer CLI來調用,更多請參考HDFS Commands Guide。
新的守護進程&堆內存管理
Hadoop守護進程和MapReduce任務的堆內存管理發生了一系列變化。
HADOOP-10950:介紹了配置守護集成heap大小的新方法。主機內存大小可以自動調整,HADOOP_HEAPSIZE 已棄用。
MAPREDUCE-5785:map和reduce task堆大小的配置方法,所需的堆大小不再需要通過任務配置和Java選項實現,已經指定的現有配置不受此更改影響。
基於HDFS路由器的聯合
HDFS Router-Based Federation 添加了一個 RPC路由層,提供了多個 HDFS 命名空間的聯合視圖。
與現有 ViewFs 和 HDFS Federation 功能類似,不同之處在於掛載表(mount table)由服務器端(server-side)的路由層維護,而不是客戶端。這簡化了現有 HDFS客戶端 對 federated cluster 的訪問。
YARN 資源類型
YARN 資源模型(YARN resource model)已被推廣為支持用戶自定義的可數資源類型(support user-defined countable resource types),不僅僅支持 CPU 和內存。
比如集群管理員可以定義諸如 GPUs、軟件許可證(software licenses)或本地附加存儲器(locally-attached storage)之類的資源。YARN 任務可以根據這些資源的可用性進行調度。
隊列配置
OrgQueue 擴展了 capacity scheduler ,通過 REST API 提供了以編程的方式來改變隊列的配置,This enables automation of queue configuration management by administrators in the queue’s administer_queue ACL。
Shell腳本重寫
1.增加了參數沖突檢測,避免重復定義和冗余參數
2.CLASSPATH, JAVA_LIBRARY_PATH, and LD_LIBRARY_PATH等參數的去重,縮短環境變量
3.shell腳本重構,將更多的代碼加入function中,提供重載,刪除重復代碼,便於測試
4.腳本清理和簡化
5.盡可能與當前系統保持兼容
6.提供一份Hadoop環境變量列表
磁盤平衡器
Hadoop3.x支持單個Datanode上,不同硬盤間的數據balancer。老版本的hadoop只支持在Datanode之間進行balancer,每個節點內部不同硬盤之間若發生了數據不平衡,則沒有一個好的辦法進行處理。
現在可以通過hdfs diskbalancer命令,進行節點內部硬盤間的數據平衡。該功能默認是關閉的,需要手動設置參數dfs.disk.balancer.enabled為true來開啟。