天天看點

Hadoop2.x 體系結構和源碼編譯

體系結構

Hadoop1的核心組成包括HDFS和MapReduce。HDFS和MapReduce的共同點就是他們都是分布式的。

HDFS是包括主節點NameNode,隻有一個,還有很多從節點DataNode,還有很多個。

NameNode含有我們使用者存儲的中繼資料的資訊,把這些資料存儲在硬碟上,但是在運作時是加載在記憶體中的。

Hadoop1HDFS缺點:

1) 當我們的NameNode無法在記憶體中加載全部的中繼資料資訊的時候,叢集的壽命到頭了。為了叢集的壽命更長,我們需要設定NameNode的節點是大記憶體的,記憶體越大越好。

2) Namenode隻有一個節點,是以權限設計不夠合理。 不能完全實體隔離。舉例:10個使用者共用linux權限隔離徹底還是每個使用者在獨立的機器上隔離的徹底,很明顯是後者。

3) HDFS存儲資料有blocK概念,預設是64MB,可以改成128或者256。如果上傳的資料都是大量的小檔案,比如都是1MB,2MB的小檔案,那麼對我們的HDFS叢集會造成NameNode的中繼資料資訊會急劇膨脹,每個小檔案都是獨立中繼資料資訊。

改進:

1) 一個NameNode裝不下資料,硬體上已經無法突破,那麼我們從軟體體系中進行改進。一個NameNode不夠用,那麼就2個NameNode一起共存。它們組成hdfs federation。

2) 實作高可靠,可以實作NameNode的核心中繼資料同時存放在多個節點上。也可以使用SecondNameNode,NameNode宕了,SecondNameNode還可以做事。預設的情況下全是手動恢複或者手動切換,沒有自動化。HDFS 高可靠自動化需要第三方軟體。

Hadoop2 實作了HA,它有兩個NameNode。

寫資料的NameNode處于active狀态,讀資料的NameNode處于standby狀态。

HA兩個NameNode使用相同的命名空間。與HDFS聯盟不一樣,聯盟使用的是兩個獨立的命名空間。

兩個NameNode到底誰提供服務?如果一個NameNode宕了,是否還要改程式(IP、主機變了)?

我們不需要去管。不用改程式。我們隻看到一個HDFS,根本看不到兩個NameNode的不同。對外提供的是統一的接口。

Active宕了,standby要轉為Active,誰去做這樣的事情?

兩種方式,一手工做,二自動切換。

如何實作HA自動切換,需要Zookeeper.

MapReduce包括主節點JobTracker,隻有一個;還有從節點TaskTracker,有很多個。

JobTracker主要的工作是管理使用者送出的作業和配置設定資源。每個TaskTracker有兩個slot,也就是在一個TaskTracker最多有兩個運作任務,預設是兩個,可以更多,但是占有的記憶體也就多了。

MapReduce處理的作業都是批處理的作業,對實時性要求不高的作業。

Hadoop1MapReduce缺點:

1) 對于實時性作業和批處理作業,需要搭建不同的叢集環境。意味着硬體投入會多,需要很多伺服器去做這樣的事。并且相同的資料分散在兩套不同的叢集體系中,資料需要同時傳在兩套不同的叢集體系中。不同的環境運作的是不同的作業類型,從另一個角度講每個叢集環境的資源使用率是不高的。叢集可能是這樣的情況,使用者要求實時性的作業,那麼使用spark或者storm,運作完之後,處理完的資料我們進行批處理,又由hadoop叢集來做,從時間軸上來看,前面的叢集是在前段時間有作業,後面的叢集在後段時間有作業,資源使用率不高是從這個角度上講。為了提高資源的使用率最好把它們合并到一套平台上。

2) MapReduce職責過多,需要分解。

hadoop2:Yarn用于處理資源配置設定和任務排程。

Yarn:

ResourceManeger:配置設定資源的(CPU、記憶體)

NodeManeger:它管理Hadoop叢集中單個計算節點

Yarn的RM接收到我們客戶送出的MapReduce程式後,把程式交給NodeManager,啟動一個程序xxxAppMaster(在某個NodeManager上), xxxAppMaster再在其他節點上配置設定tasktracker。

源碼編譯

為什麼要進行hadoop的源碼編譯?

看這篇文章:http://blog.csdn.net/xuefengmiao/article/details/25182323

hadoop2的學習資料很少,隻有官網的少數文檔。如果想更深入的研究hadoop2,除了僅看官網的文檔外,還要學習如何看源碼,通過不斷的調試跟蹤源碼,學習hadoop的運作機制。

當你發現hadoop 存在bug而你又有能力修複的時候,可以嘗試改源碼bug然後重新編譯,這樣你就可以使用你fix bug 後的hadoop了。

如何進行hadoop源碼的編譯?

可以看我之前寫過的一篇文章:

hadoop2.x源碼編譯

本文作者: chaplinthink, 關注領域:大資料、基礎架構、系統設計, 一個熱愛學習、分享的大資料工程師