體系結構
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, 關注領域:大資料、基礎架構、系統設計, 一個熱愛學習、分享的大資料工程師