如何高效的閱讀hadoop原始碼?

親吻昨日的陽光發表於2015-04-29

這篇文章的內容是從知乎的帖子上摘抄下來的,是董西成的經驗之作,雖然我還沒有來的及通讀原始碼,但覺得這經驗有些意義就轉載來與大家共享。

============

首先,不得不說,hadoop發展到現在這個階段,程式碼已經變得非常龐大臃腫,如果你直接閱讀最新版本的原始碼,難度比較大,需要足夠的耐心和時間,所以,如果你覺得認真一次,認真閱讀一次hadoop原始碼,一定要有足夠的心理準備和時間預期。

其次,需要注意,閱讀Hadoop原始碼的效率,因人而異,如果你有足夠的分散式系統知識儲備,看過類似的系統,則能夠很快地讀它的原始碼進行通讀,並快速切入你最關注的區域性細節,比如你之前看過某個分散式資料庫的原始碼,對分散式系統的網路通訊模組,排程模組等有一定了解,這對閱讀hadoop原始碼有極大幫助;如果你是一個初學者,對hadoop一無所知,只瞭解一些java語法,那閱讀hadoop原始碼是極具挑戰的一件事情,尤其是從無到開始入門的過程,是極度煎熬和困惑的,這時候需要你在閱讀程式碼過程中,不斷補充缺乏的相關知識(比如RPC,NIO,設計模式等),循序漸進,直到入門。
接下來進入主題,說一下閱讀原始碼的個人經驗。由於我也是從無到入門,再到修改原始碼,逐步過渡的,所以,對於很多人而言,具有借鑑意義。

============
第一個階段:學習hadoop基本使用和基本原理,從應用角度對hadoop進行了解和學習
這是第一個階段,你開始嘗試使用hadoop,從應用層面,對hadoop有一定了解,比如你可以使用hadoop shell對hdfs進行操作,使用hdfs API編寫一些程式上傳,下載檔案;使用MapReduce API編寫一個資料處理程式。一旦你對hadoop的基本使用方法比較熟悉了,接下來可以嘗試瞭解它的內部原理,注意,不需要通過閱讀原始碼瞭解內部原理,只需看一些部落格,書籍,比如《Hadoop權威指南》,對於HDFS而言,你應該知道它的基本架構以及各個模組的功能;對於MapReduce而言,你應該知道其具體的工作流程,知道partition,shuffle,sort等工作原理,可以自己在紙上完整個畫完mapreduce的流程,越詳細越好。
在這個階段,建議你多看一些知名部落格,多讀讀《hadoop權威指南》(可選擇性看相關的幾章)。如果你有實際專案驅動,那是再好不過了,理論聯絡實際是最好的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技術內幕)就是最好的參考資料。藉助這些部落格和書籍,你可以在前人的幫助下,更快地學習hadoop原始碼,節省大量時間,注意,目前部落格和書籍很多,建議大家廣泛收集資料,找出最適合自己的參考資料。
這個階段最終達到的目的,是對hadoop原始碼整體架構和區域性的很多細節,有了一定的瞭解。比如你知道MapReduce Scheduler是怎樣實現的,MapReduce shuffle過程中,map端做了哪些事情,reduce端做了哪些事情,是如何實現的,等等。這個階段完成後,當你遇到問題或者困惑點時,可以迅速地在Hadoop原始碼中定位相關的類和具體的函式,通過閱讀原始碼解決問題,這時候,hadoop原始碼變成了你解決問題的參考書。

============
第三個階段:根據需求,修改原始碼。
這個階段,是驗證你閱讀原始碼成效的時候。你根據leader給你的需求,修改相關程式碼完成功能模組的開發。在修改原始碼過程中,你發現之前閱讀原始碼仍過於粗糙,這時候你再進一步深入閱讀相關程式碼,彌補第二個階段中薄弱的部分。當然,很多人不需要經歷第三個階段,僅僅第二階段就夠了:一來能夠通過閱讀程式碼解決自己長久以來的技術困惑,滿足自己的好奇心,二來從根源上解決解決自己遇到的各種問題。 這個階段,沒有太多的參考書籍或者部落格,多跟周圍的同事交流,通過程式碼review和測試,證明自己的正確性。

============

閱讀hadoop原始碼的目的不一定非是工作的需要,你可以把他看成一種修養,通過閱讀hadoop原始碼,加深自己對分散式系統的理解,培養自己踏實做事的心態。

原文地址:http://www.zhihu.com/question/29690410/answer/45588479

相關文章