怎樣才能高效閱讀Hadoop源代碼

我的談談閱讀hadoop源代碼的經驗。首先,不得不說,Hadoop發展到如今這個階段,代碼已經變得很是龐大臃腫,若是你直接閱讀最新版本的源代碼,難度比較大,須要足夠的耐心和時間,因此,若是你以爲認真一次,認真閱讀一次hadoop源代碼,必定要有足夠的心理準備和時間預期。
其次,須要注意,閱讀Hadoop源代碼的效率,因人而異,若是你有足夠的分佈式系統知識儲備,看過相似的系統,則可以很快地讀它的源代碼進行通讀,並快速切入你最關注的局部細節,好比你以前看過某個分佈式數據庫的源代碼,對分佈式系統的網絡通訊模塊,調度模塊等有必定了解,這對閱讀hadoop源代碼有極大幫助;若是你是一個初學者,對hadoop一無所知,只瞭解一些Java語法,那閱讀hadoop源代碼是極具挑戰的一件事情,尤爲是從無到開始入門的過程,是極度煎熬和困惑的,這時候須要你在閱讀代碼過程當中,不斷補充缺少的相關知識(好比RPC,NIO,設計模式等),按部就班,直到入門。
接下來進入主題,說一下閱讀源代碼的我的經驗。因爲我也是從無到入門,再到修改源代碼,逐步過渡的,因此,對於不少人而言,具備借鑑意義。
第一個階段:學習hadoop基本使用和基本原理,從應用角度對hadoop進行了解和學習
這是第一個階段,你開始嘗試使用hadoop,從應用層面,對hadoop有必定了解,好比你可使用hadoop shell對hdfs進行操做,使用hdfs API編寫一些程序上傳,下載文件;使用MapReduce API編寫一個數據處理程序。一旦你對hadoop的基本使用方法比較熟悉了,接下來能夠嘗試瞭解它的內部原理,注意,不須要經過閱讀源代碼瞭解內部原理,只需看一些博客,對於HDFS而言,你應該知道它的基本架構以及各個模塊的功能;對於MapReduce而言,你應該知道其具體的工做流程,知道partition,shuffle,sort等工做原理,能夠本身在紙上完整個畫完mapreduce的流程,越詳細越好。
若是你有實際項目驅動,那是再好不過了,理論聯繫實際是最好的hadoop學習方法;若是你沒有項目驅動,那建議你不要本身一我的悶頭學,多跟別人交流,多主動給別人講講,最好的學習方式仍是「講給別人聽」。
第二個階段:從無到入門,開始閱讀hadoop源代碼
這個階段是最困苦和漫長的,尤爲對於那些沒有任何分佈式經驗的人。 不少人這個階段沒有走完,就放棄了,最後停留在hadoop應用層面。
這個階段,第一件要作的事情是,選擇一個hadoop組件。若是你對分佈式存儲感興趣,那麼你能夠選擇HDFS,若是你讀分佈式計算感興趣,你能夠選擇MapReduce,若是你對資源管理系統感興趣,你能夠選擇YARN。
選擇好系統後,接下來的經歷是最困苦的。當你把hadoop源代碼導入eclipse或intellij idea,沏上一杯茶,開始準備優哉遊哉地看hadoop源代碼時,你懵逼了:你展開那數不盡的package和class,以爲無從下手,好不容易找到了入口點,而後你屁顛屁顛地經過eclipse的查找引用功能,順着類的調用關係一層層找下去,最後迷失在了代碼的海洋中,如同你在不盡的壓棧,最後棧溢出了,你忘記在最初的位置。不少人經歷過上面的過程,最後沒有順利逃出來,而放棄。
若是你正在經歷這個過程,個人經驗以下:首先,你要摸清hadoop的代碼模塊,知道client,master,slave各自對應的模塊(hadoop中核心繫統都是master/slave架構,很是相似),並在閱讀源代碼過程當中,時刻謹記你當前閱讀的代碼屬於哪個模塊,會在哪一個組件中執行;以後你須要摸清各個組件的交互協議,也就是分佈式中的RPC,這是hadoop本身實現的,你須要對hadoop RPC的使用方式有所瞭解,而後看各模塊間的RPC protocol,到此,你把握了系統的骨架,這是接下來閱讀源代碼的基礎;接着,你要選擇一個模塊開始閱讀,我通常會選擇Client,這個模塊相對簡單些,會給本身增長信心,爲了在閱讀代碼過程當中,不至於迷失本身,建議在紙上畫出類的調用關係,邊看邊畫,我記得我閱讀hadoop源代碼時,花了一疊紙。注意,看源代碼過程當中,很容易煩躁不安,建議常常起來走走,不要把本身逼得太緊。
在這個階段,建議你們多看一些源代碼分析博客和書籍,藉助這些博客和書籍,你能夠在前人的幫助下,更快地學習hadoop源代碼,節省大量時間,注意,目前博客和書籍不少,建議你們普遍收集資料,找出最適合本身的參考資料。
這個階段最終達到的目的,是對hadoop源代碼總體架構和局部的不少細節,有了必定的瞭解。好比你知道MapReduce Scheduler是怎樣實現的,MapReduce shuffle過程當中,map端作了哪些事情,reduce端作了哪些事情,是如何實現的,等等。這個階段完成後,當你遇到問題或者困惑點時,能夠迅速地在Hadoop源代碼中定位相關的類和具體的函數,經過閱讀源代碼解決問題,這時候,hadoop源代碼變成了你解決問題的參考書。
第三個階段:根據需求,修改源代碼。
這個階段,是驗證你閱讀源代碼成效的時候。你根據leader給你的需求,修改相關代碼完成功能模塊的開發。在修改源代碼過程當中,你發現以前閱讀源代碼仍過於粗糙,這時候你再進一步深刻閱讀相關代碼,彌補第二個階段中薄弱的部分。固然,不少人不須要經歷第三個階段,僅僅第二階段就夠了:一來可以經過閱讀代碼解決本身長久以來的技術困惑,知足本身的好奇心,二來從根源上解決解決本身遇到的各類問題。 這個階段,沒有太多的參考書籍或者博客,多跟周圍的同事交流,經過代碼review和測試,證實本身的正確性。
閱讀hadoop源代碼的目的不必定非是工做的須要,你能夠把他當作一種修養,經過閱讀hadoop源代碼,加深本身對分佈式系統的理解,培養本身踏實作事的心態。
 shell

相關文章
相關標籤/搜索