1. 程式人生 > >Apache頂級專案介紹4 - Hadoop

Apache頂級專案介紹4 - Hadoop

大象起舞,天下太平,極客們應該知道我們的重量級人物Hadoop登場了。

提到Hadoop, 正所謂飲水思源,我們不得不提及一下Hadoop之父,其對技術界的影響,在近10年可謂重大, 他就是Doug Cutting, 其傳奇人生及其大作這裡不贅述了,大家可以Google/Bing一下,之後或許我們會推出一些技術大牛的介紹以及好書推薦。


值得提及的是Hadoop之所以誕生於2005-2006之際,是Doug當時受到來自

Google Lab公開發布的幾篇paper啟發,包括Map/Reduce(2004), Google 

File System(GFS)-2003,Doug於2006年加入Yahoo, 在Yahoo的慧眼及大力推動下,山寨出身的Hadoop的運勢如日中天。

老樣子,Hadoop官網介紹,Hadoop是一個開源框架,適合執行在通用硬體,支援用簡單程式模型分散式處理跨叢集大資料集,支援從單一伺服器到上千伺服器的水平scale up。BTW, Hadoop的官網真是無法形容,毫無美感,文字堆砌,與後來的Docker, Spark等無法相提並論。畢竟這是一個顏值時代。

上架構圖:

Hadoop 1.x架構剛開始比較簡單,只有2個大的模組MapReduce和

HDFS, 其中MapReduce不單包含了分散式計算,還有叢集資源管理,HDFS是Hadoop的核心分散式檔案系統,提供了分散式高吞吐檔案系統管理。


在後續的Hadoop 2.x版本中(目前穩定版本為2.7.x),


架構做了大幅改進,支援MapReduce批處理, Tez互動式,以及抽象獨立的YARN負責job scheduling和叢集資源管理,還有HDFS2,還有上圖沒有體現的

Common模組包含了一些公共功能,如安全認證以及支援其它模組基礎功能。 同時,開放介面支援Online HBase, Streaming, In-Memory Spark等。

值得一提的是, 關於HDFS2,借鑑吸取了後起之秀Spark的計算模型,正所謂 

“移動計算比移動資料更划算”, 之RDD之精髓。

好吧,先來介紹HDFS架構圖:


HDFS毫無疑問的採用了master/slave架構, 一個HDFS叢集是由一個NameNode和多個DataNodes組成。NameNode是一箇中心伺服器,負責管理檔案系統的名字空間namespace以及客戶端對檔案的訪問。DataNode一般是一個節點一個,負責管理它所在節點的儲存。一個檔案根據大小被拆分成一個或多個數據塊,這些資料塊儲存在一組DataNode上,NameNode執行檔案系統的操作,如開啟,關閉,重新命名等,同時也負責確定資料塊到具體datanodes節點的對映。

datanode負責處理檔案系統客戶端的讀寫請求,在namenode的統一排程下進行資料的處理,如建立,刪除,複製等。叢集中單一的namenode結構大大簡化了系統架構,namenode統一管理hdfs原資料,使用者資料永遠不會存放於

namenode。所有的hdfs通訊協議建立在tcp/ip之上。其中,client是向

namenode發起檔案讀寫請求的,namenode再根據配置返回給client相應的

datanode資訊。一個block預設配置會有3分備份。

細心的讀者可能會發現,namenode是萬能的,高效的,中央集權的。卻隱隱存在巨大的單點故障風險,如果namenode出現故障,那整個hdfs都無法運作了,即非HA.

Hadoop 2.x後引入了HDFS2, 包含了2個namenode(目前支援2個),一個處於active狀態,一個處於standby狀態。當active出現問題時就自動切換,如何自動切換就借用了我們上一篇提到的zookeeper了,叢集中的兩個

namenode都在zookeeper中註冊,zk負責監測namenode狀態以及自動切換。說白了就是又引入一層來管理,計算機以及程式裡的抽象與問題解決大多是引入新的一層或者角色來做到的。


另外讀者可能也會注意到的是namenode是核心節點,維護著整個hdfs的元資料資訊,但其容量是有限的,當namenode所在伺服器記憶體無法裝載後,整個hdfs叢集就受制於他,這可無法支撐sale up成千上完的叢集大資料。其解決辦法為引入了hdfs Federation,即有多個hdfs叢集。一個總叢集中,可以虛擬出多個單獨小叢集,各個小叢集間資料可以實時共享。

上圖:


好了,hdfs到此,我們繼續介紹第二個核心模組mapreduce。下圖以著名的
wordcount為例,介紹m/r整體結構:


mr程式設計框架原理,利用一個輸入的key-value對集合來產生一個輸出的

key-value對集合。mr庫通過map(對映)和reduce(化簡)兩個函式來實現,說到底其核心思想也就是我們大學學的資料結構中的分而治之演算法吧。使用者自定義的map函式接受一個輸入key-value對,然後產生一箇中間的key-value對的集合,mr把所有具有相同key值的value結合在一起,然後傳遞給reduce函式,reduce接受合併這些value值,形成一個較小的value 集合,reduce函式具備了在叢集上大規模分散式資料處理的能力。與傳統的分散式計算設計相比,mapreduce封裝了並行處理,容錯處理,本地化計算,負載均衡等細節。

上圖中,reduce又包含了3個主要階段,shuffle,sort和reduce。這裡有必要提及一下shuffle:


shuffle操作就是針對多個map任務的輸出按照不同的分割槽partition通過網路複製到不同的reduce任務節點上,這整個過程叫做shuffle。

繼續介紹第三大核心YRAN:

整體架構中的yran

繼續抽象:


YARN的內部細節架構:

YARN分層結構的本質是ResourceManager。它控制整個叢集並管理應用程式向基礎計算資源分配。ResourceManager將各個資源部份(計算,記憶體,頻寬等)安排給基礎nodemanager(YARN的每節點代理)。ResourceManger還與ApplicationMaster一起分配資源,與NodeManager一起監控基礎應用。在上下文,承擔了以前的TaskTracker的一些角色,ResourceManager承擔了

JobTracker的角色。Hadoop 1.x架構受到了JobTracker的高度約束,

jobtracker負責整個叢集的資源管理與作業排程,新的Hadoop 2.x打破了這種模型,ResourceManager管理資源,ApplicationMaster負責作業。YARN還允許使用Message Passing Interface通訊模型,執行不同程式設計模型,包括圖形,迭代式,機器學習等計算。

好了,上程式碼吧,沒時間寫了,官網word count:

“簡單”明瞭,無需多數,作者簡單加了引號,注意這段經典程式碼後來被Spark用來作為案例,幾句就搞定了。

最後,我們來看一下Hadoop的生態系統:



Hadoop v2.x生態系統如日中天,百家爭鳴。這裡僅僅拋個引子。

好了,本文僅作為Hadoop的專案介紹就到此了,相信群裡有很多Hadoop大牛技術專家,各位不靈賜教。

公眾號:技術極客TechBooster