天天看點

六點解讀Hadoop版本和生态圈

(1) Apache Hadoop版本介紹

Apache的開源項目開發流程:

主幹分支:新功能都是在主幹分支(trunk)上開發。

特性獨有分支:很多新特性穩定性很差,或者不完善,在這些分支的獨有特定很完善之後,該分支就會并入主幹分支。

候選分支:定期從主幹分支剝離,一般候選分支釋出,該分支就會停止更新新功能,如果候選分支有BUG修複,就會重新針對該候選分支釋出一個新版本,候選分支就是釋出的穩定版本。

造成Hadoop版本混亂的原因:

主要功能在分支版本開發:0.20分支釋出之後,主要功能一直在該分支上進行開發,主幹分支并沒有合并這個分支,0.20分支成為了主流。

低版本的後釋出:0.22版本釋出要晚于0.23版本。

版本重命名:0.20分支的0.20.205版本重命名為1.0版本,這兩個版本是一樣的,隻是名字改變了。

Apache Hadoop版本示意圖:

六點解讀Hadoop版本和生态圈

(2) Apache Hadoop版本功能介紹

第一代Hadoop特性:

append:支援檔案追加功能,讓使用者使用HBase的時候避免資料丢失,也是使用HBase的前提。

raid:保證資料可靠,引入校驗碼校驗資料塊數目。

symlink:支援HDFS檔案連結。

security:hadoop安全機制。

namenode HA:為了避免namenode單點故障情況,HA叢集有兩台namenode。

第二代Hadoop特性:

HDFS Federation:NameNode制約HDFS擴充,該功能讓多個NameNode分管不同目錄,實作通路隔離和橫向擴充。

yarn:MapReduce擴充性和多架構方面支援不足,yarn是全新的資源管理架構,将JobTracker資源管理和作業控制功能分開,ResourceManager負責資源管理,ApplicationMaster負責作業控制。

0.20版本分支:隻有這個分支是穩定版本,其它分支都是不穩定版本。

0.20.2版本(穩定版):包含所有特性,經典版。

0.20.203版本(穩定版):包含append,不包含symlink raid namenodeHA功能。

0.20.205版本/1.0版本(穩定版):包含append security,不包含symlink raid namenodeHA功能。

1.0.1~1.0.4版本(穩定版):修複1.0.0的bug和進行一些性能上的改進。

0.21版本分支(不穩定版):包含append raid symlink namenodeHA,不包含security。

0.22版本分支(不穩定版):包含 append raid symlink那麼弄得HA,不包含mapreduce security。

0.23版本分支:

0.23.0版本(不穩定版):第二代的hadoop,增加了HDFS Federation和yarn。

0.23.1~0.23.5(不穩定版):修複0.23.0的一些BUG,以及進行一些優化。

2.0.0-alpha~2.0.2-alpha(不穩定版):增加了namenodeHA 和 Wire-compatiblity功能。

(3) Cloudera Hadoop對應Apache Hadoop版本

六點解讀Hadoop版本和生态圈

Apache支援:Hadoop的核心項目都受Apache支援的,除了Hadoop之外,還有下面幾個項目,也是Hadoop不可或缺的一部分。

HDFS:分布式檔案系統,用于可靠的存儲海量資料。

MapReduce:分布式處理資料模型,可以運作于大型的商業雲計算叢集中。

Pig:資料流語言和運作環境,用來檢索海量資料集。

HBase:分布式資料庫,按列存儲,HBase使用HDFS作為底層存儲,同時支援MapReduce模型的海量計算和随機讀取。

Zookeeper:提供Hadoop叢集的分布式的協調服務,用于建構分布式應用,避免應用執行失敗帶來的不确定性損失。

Sqoop:該工具可以用于HBase 和 HDFS之間的資料傳輸,提高資料傳輸效率。

Common:分布式檔案系統,通用IO元件與接口,包括序列化、Java RPC和持久化資料結構。

Avro:支援高效跨語言的RPC及永久存儲資料的序列化系統。

MapReduce簡介:MapReduce是一種資料處理程式設計模型。

多語言支援:MapReduce可以使用各種語言編寫,例如Java、Ruby、Python、C++。

并行本質 :MapReduce 本質上可以并行運作的。

MapReduce資料模型:

兩個階段:MapReduce的任務可以分為兩個階段,Map階段和Reduce階段。

輸入輸出:每個階段都使用鍵值對作為輸入和輸出,IO類型可以由程式員進行選擇。

兩個函數:map函數和reduce函數。

MapReduce作業組成:一個MapReduce工作單元,包括輸入資料,MapReduce程式和配置資訊。

作業控制:作業控制由JobTracker(一個)和TaskTracker(多個)進行控制的。

JobTracker作用:JobTracker控制TaskTracke上任務的運作,進行統一排程。

TaskTracker作用:執行具體的MapReduce程式。

統一排程方式:TaskTracker運作的同時将運作進度發送給JobTracker,JobTracker記錄所有的TaskTracker。

任務失敗處理:如果一個TaskTracker任務失敗,JobTracker會排程其它TaskTracker上重新執行該MapReduce作業。

輸入分片:MapReduce程式執行的時候,輸入的資料會被分成等長的資料塊,這些資料塊就是分片。

分片對應任務:每個分片都對應着一個Map任務,即MapReduce中的map函數。

并行處理:每個分片執行Map任務要比一次性處理所有資料時間要短。

負載均衡:叢集中的計算機有的性能好有的性能差,按照性能合理的配置設定分片大小,比平均配置設定效率要高,充分發揮出叢集的效率。

合理分片:分片越小負載均衡效率越高,但是管理分片和管理map任務總時間會增加,需要确定一個合理的分片大小,一般預設為64M,與塊大小相同。

資料本地優化:map任務運作在本地存儲資料的節點上,才能獲得最好的效率。

分片=資料塊:一個分片隻在單個節點上存儲,效率最佳。

分片>資料塊:分片大于資料塊,那麼一個分片的資料就存儲在了多個節點上,map任務所需的資料需要從多個節點傳輸,會降低效率。

Map任務輸出:Map任務執行結束後,将計算結果寫入到本地硬碟,不是寫入到HDFS中。

中間過渡:Map的結果隻是用于中間過渡,這個中間結果要傳給Reduce任務執行,reduce任務的結果才是最終結果,map中間值最後會被删除。

map任務失敗:如果map任務失敗,會在另一個節點重新運作這個map任務,再次計算出中間結果。

Reduce任務:map任務的數量要遠遠多于Reduce任務。

無本地化優勢:Reduce的任務的輸入是Map任務的輸出,reduce任務的絕大多數資料本地是沒有的。

資料合并:map任務輸出的結果,會通過網絡傳到reduce任務節點上,先進行資料的合并,然後在輸入到reduce任務中進行處理。

結果輸出:reduce的輸出直接輸出到HDFS中。

reduce數量:reduce數量是特别指定的,在配置檔案中指定。

MapReduce資料流框圖解析:

單個MapReduce的資料流:

六點解讀Hadoop版本和生态圈

多個MapReduce模型:

六點解讀Hadoop版本和生态圈

沒有Reduce程式的MapReduce資料流:

六點解讀Hadoop版本和生态圈

Map輸出分區:多個reduce任務,每個reduce任務都對應着一些map任務,我們将這些map任務根據其輸入reduce任務進行分區,為每個reduce建立一個分區。

分區辨別:map結果有許多種類鍵,相同的鍵對應的資料傳給一個reduce,一個map可能會給多個reduce輸出資料。

分區函數:分區函數可以由使用者定義,一般情況下使用系統預設的分區函數partitioner,該函數通過哈希函數進行分區。

混洗:map任務和reduce任務之間的資料流成為混。

reduce資料來源:每個reduce任務的輸入資料來自多個map

map資料去向:每個map任務的結果都輸出到多個reduce中

沒有Reduce:當資料可以完全并行處理的時候,就可以不适用reduce,隻進行map任務。

MapReduce瓶頸:帶寬限制了MapReduce執行任務的數量,Map和Reduce執行過程中需要進行大量的資料傳輸。

解決方案:合并函數Combiner,将多個Map任務輸出的結果合并,将合并後的結果發送給Reduce作業。

Hadoop多語言支援:Java、Python、Ruby、C++

多語言:Hadoop允許使用其它語言寫MapReduce函數。

标準流:因為Hadoop可以使用UNIX标準流作為Hadoop和應用程式之間的接口,是以隻要使用标準流,就可以進行MapReduce程式設計。

Streaming處理文本:Streaming在文本處理模式下,有一個資料行視圖,非常适合處理文本。

Map函數的輸入輸出:标準流一行一行的将資料輸入到Map函數,Map函數的計算結果寫到标準輸出流中。

Map輸出格式:輸出的鍵值對是以制表符分隔的行,以這種形式寫出的标準輸出流中。

Reduce函數的輸入輸出:輸入資料是标準輸入流中的通過制表符分隔的鍵值對行,該輸入經過了Hadoop架構排序,計算結果輸出到标準輸出流中。

Pipes概念:Pipes是MapReduce的C++接口

了解誤區:Pipes不是使用标準輸入輸出流作為Map和Reduce之間的Streaming,也沒有使用JNI程式設計。

工作原理:Pipes使用套接字作為map和reduce函數程序之間的通信。

原文釋出時間為:2014年03月27日 

本文來自雲栖社群合作夥伴至頂網,了解相關資訊可以關注至頂網。