Hadoop1的核心組成包括HDFS和MapReduce。HDFS和MapReduce的共同點就是他們都是分佈式的。node
HDFS是包括主節點NameNode,只有一個,還有不少從節點DataNode,還有不少個。linux
NameNode含有咱們用戶存儲的元數據的信息,把這些數據存儲在硬盤上,可是在運行時是加載在內存中的。服務器
Hadoop1HDFS缺點:markdown
1) 當咱們的NameNode沒法在內存中加載所有的元數據信息的時候,集羣的壽命到頭了。爲了集羣的壽命更長,咱們須要設定NameNode的節點是大內存的,內存越大越好。
2) Namenode只有一個節點,因此權限設計不夠合理。 不能徹底物理隔離。舉例:10個用戶共用linux權限隔離完全仍是每一個用戶在獨立的機器上隔離的完全,很明顯是後者。
3) HDFS存儲數據有blocK概念,默認是64MB,能夠改爲128或者256。若是上傳的數據都是大量的小文件,好比都是1MB,2MB的小文件,那麼對咱們的HDFS集羣會形成NameNode的元數據信息會急劇膨脹,每一個小文件都是獨立元數據信息。分佈式
改進:
1) 一個NameNode裝不下數據,硬件上已經沒法突破,那麼咱們從軟件體系中進行改進。一個NameNode不夠用,那麼就2個NameNode一塊兒共存。它們組成hdfs federation。oop
2) 實現高可靠,能夠實現NameNode的核心元數據同時存放在多個節點上。也可使用SecondNameNode,NameNode宕了,SecondNameNode還能夠作事。默認的狀況下全是手動恢復或者手動切換,沒有自動化。HDFS 高可靠自動化須要第三方軟件。學習
Hadoop2 實現了HA,它有兩個NameNode。spa
寫數據的NameNode處於active狀態,讀數據的NameNode處於standby狀態。
HA兩個NameNode使用相同的命名空間。與HDFS聯盟不同,聯盟使用的是兩個獨立的命名空間。.net
兩個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源碼的編譯?
能夠看我以前寫過的一篇文章: