hadoop的源代碼寫的怎麼樣?

hadoop1或hadoop2均可


作為認真閱讀過hadoop源代碼的人,我個人覺得有必要跟大家分享一下這方面的體會。

首先,必須要說,對於互聯網工程師而言,不管hadoop源代碼質量怎麼樣,是好還是差,我們都不得不看,別無選擇,因為hadoop已逐漸成為大數據代名詞,成為互聯網公司的基礎設施和軟體,和傳統的操作系統一樣基礎而又重要。另外,有人會問,對於只是使用hadoop的人,有沒有必要學習hadoop源代碼?這個取決於你個人的興趣,追求和工作內容。一般而言,hadoop職位分別內核開發工程師(修改hadoop源代碼,打patch,加feature等),hadoop運維工程師(遇到hadoop服務問題,比如namenode掛了,主備切換失敗,可以採取相應的措施快速解決),hadoop應用開發工程師(在hadoop基礎上寫一些app,比如寫HQL生成報表,寫一些數據挖掘演算法等),對於前兩個崗位,如果你是一個有追求的工程師的話,需要好好看源代碼,尤其是運維工程師,不能僅僅依賴於搜索引擎和各種雜七雜八的文檔,因為hadoop的很多東西,比如參數配置(hadoop中有幾百個配置參數),跟hadoop版本相關,而hadoop版本迭代和發布頻繁,很多文檔和論壇里的帖子已經失效而無法及時更新,因此,一味的依賴這種二手資料,只會讓你浪費更多時間。 這時候,最好的方式是查看源代碼,找到相關的類,看一下怎麼實現的,問題可以馬上解決。你可以把hadoop源代碼看成一本巨大的參考手冊,遇到問題,就翻到能夠給你帶來答案的「頁」中。

====================== hadoop源代碼 ======================
理解了相關背景後,接下來聊聊hadoop源代碼質量。
Hadoop源代碼質量絕對是開源軟體中的佼佼者,從代碼規範,到代碼組織,再到代碼實現技巧。這一點,可以與各種雜七雜八的公司自己開發的軟體作對比(提一點,即使是非常有名的公司,掛在自己名下的開源軟體代碼質量也不高,比如facebook的presto,比如linkedin的azkaban等,提高代碼質量和發動更多人關注這些軟體,最好的方式是加入apache基金會,成為它的頂級項目),很容易得知。hadoop專門的基金會組織管理和運營,有一整套完善的項目管理流程。可以這麼說,如果你把hadoop源代碼學到精通,那麼學習其他開源軟體,尤其是分散式系統,絕對是小case,另外,對你自己從頭寫一個分散式系統也有巨大幫助。

hadoop源代碼中包含著很多有價值的,可以借鑒和學習的寶貴經驗,比如:
(1)如果自己實現一個高效的RPC框架(hadoop自己實現了一個RPC框架,這個框架由HDFS,MAPREDUCE,YARN和HBASE公用)
(2)如何對單點的服務實現leader election(包括HDFS,YARN,HBase等都存在單點故障問題,均採用zookeeper實現了準備切換)
(3)如何實現一個分散式存儲系統和分散式計算引擎
(4)如何設計一個極簡且抽象度高的編程API(記得MapReduce剛剛發布時,很多公司對外公布說,自己公司內部早就有了類似於mapreduce的框架,一直在用。但mapreduce成熟之後,所有公司都棄掉了自己的框架,轉而採用hadoop mapreduce,主要原因是他們的框架抽象度不高,使用起來比較麻煩。雖然現在大家使用mapreduce覺得這玩意非常簡單,但是這是高度抽象後去繁留簡的結果,如果你自己做一個分散式計算框架,能設計出這麼精簡的編程模型和編程API嗎)

====================== hadoop現狀 ======================
需要注意的是,hadoop從第一個原型開始,到現在已經有10年左右的時間。目前hadoop代碼龐大,學習起來越來越困難,這個跟linux內核發展史差不多。由於hadoop源代碼是很多人貢獻的,裡面多多少少存在代碼冗餘,且個別功能點的實現比較令人費解。此外,一些hadoop公司的的出現,比如cloudera,hortonworks(已經上市),使得hadoop更新頻率越來越快,這些公司的絕大部分工程師每天的任務就是為hadoop貢獻代碼,全部貢獻給社區,這推進了hadoop快速發展,但同時使得hadoop學習成本越來越大,很多中小型公司無法找到合適的技術人員,不得不反過來向這些hadoop公司求助,給他們交比較昂貴的諮詢費用。

現在每一行hadoop源代碼的提交均要經過很多人的review,從代碼規範到實現方式上,都會有很多人在jira(Hadoop YARN - ASF JIRA)上提出各種意見,估計要改上好幾遍才可能被merge到主幹上,整個流程很低效,但是這樣可使hadoop源代碼保持很高的水準。

儘管hadoop源代碼非常龐大,但仍存在一些非常高效的閱讀方式和技巧,但這個話題不是關於如何高效閱讀hadoop源代碼的,所有就不在這裡回答了。
最後,做個廣告,給大家推薦我個人的hadoop技術博客(http://dongxicheng.org/)和微信公眾賬號,我會定期發布hadoop文章,如果你對大數據感興趣,歡迎加入,二維碼如下:

http://weixin.qq.com/r/rHVvdwXEYFgfrUEU9yC_ (二維碼自動識別)


問題估計答案:Hadoop代碼寫得非常好
==========================
開個玩笑,最近在忙項目,細寫的話估計沒這麼多時間,我就把我當時看的過程講訴一下吧。
(本人自我感覺比較水,說錯的地方請多多包涵,感覺第一次正式答題,逃)。。。

==========================
當時看的源碼是Hadoop2.2.0 , 代碼以模塊來劃分,主要分為:公共基礎類庫Hadoop-Common, MapReduce的計算框架實現部分(mrv2將資源調度放到Yarn),HDFS的分散式存儲實現,Yarn任務調度和資源管理部分。代碼少少估計都幾萬行,不可能快速看完,所以首先要明確你所希望研究的部分,例如當時我對MapReduce和Yarn部分感興趣,並且希望能實現自己的任務調度策略,明確目標的來看和研究會得心應手。
在研究一個項目之前最好先搭建一下Hadoop的運行環境,然後跑一下wordcount來切實體驗一下,然後設置遠程debug,來逐步了解整個項目。
1. 先去對hadoop的項目結構有個大體了解,具體的代碼結構可以參考:
hadoop2包結構及包功能大致介紹
2. 源代碼的講解可以去觀摩董西城大神和他的書,分別是mapreduce和yarn部分:
Hadoop新書,Hadoop技術內幕:深入解析MapReduce架構設計與實現原理
《Hadoop技術內幕:深入解析YARN架構設計與實現原理》
3. 如果是對HDFS部分感興趣可以觀摩:
《Hadoop技術內幕:深入解析Hadoop Common和HDFS架構設計與實現》
4. 當然一遍閱讀源代碼一邊逐行debug是最佳的學習方式:
hadoop debug設置

我覺得我自己寫的話,肯定寫不出那幾本書的源碼講解水平。。所以就不獻醜了。。
(如果需要討論某一個模塊的實現和設計可以評論或私信,多多交流)

突然感覺自己偏題了,題目明明問的是:hadoop的源代碼寫的怎麼樣? 這是不是應該回答:好不好(還是我語文水平差),而不是如何學習hadoop的源代碼。好吧,我覺得通過看mapreduce和yarn部分的源碼,最大的感受是如何設計和實現一個分散式程序,還有各個程序之間的通信,高並發,線程安全等。源代碼中採用了很多設計模式,印象比較深刻和模仿實現的是:RPC模塊和事件驅動任務處理機制。自己在寫分散式程序的時候也會模仿著hadoop程序的寫法,注意線程使用和安全,在任務時,會使用基於非同步隊列的狀態事件方式來處理任務……

其他的如果有需要再補充,先睡了……逃……


代碼不評論
但api封裝的不咋地
mapreduce那套應該算是核心api了吧?
就寫成那樣
我剛接觸的時候就很奇怪:
我x,難道做大數據的同行們都一直忍受著這種痛苦的用法?
還好,後來看到了spark
才證明我不是故意挑刺的人


我讀過Hadoop YARN部分源碼,並在原有基礎上修改過功能。
沒怎麼看過其他框架的源碼,無從比較,但與Spark、openstack相比的話,感覺hadoop2的源碼閱讀起來還是更費解一些,一方面由於Java封裝,繼承,多態,使得代碼看起來比較零散;另一方面,Hadoop 2本身設計時採用的RPC協議,Protocol Buffer,服務與事件機制,狀態機等設計結構,使得代碼進一步抽象。又加大了閱讀難度,在熟悉這些基礎知識背景時就花了差不多一年事件。部署,修改,debug,看實際效果,周期性又比較長。
因此,hadoop 2源碼閱讀屬於入門比較難,但是鑽研起來收穫很大的一類。


典型Hadoop雲計算 這本書還是挺不錯的,不知道是不是對你有幫助呢


閱讀過hadoop v2.0(mapreduce計算框架,yarn的資源調度,HDFS文件系統)和spark的源代碼。同時現在做的幾個東西都是基於這些源代碼修改。給幾點建議:
1. 搞清楚裡面的事件處理機制,基本上所有代碼的耦合都是通過事件處理機制實現的。現在我看來這一套實現方式很優美。首先保證了模塊模塊間最大程度的耦合,A模塊就處理a事件。你如果想增加個新功能基本上只要增加一個a2事件以及對應的事件處理函數。其次,時間處理機制可以保證儘可能少的試用lock。多線程情況下lock有多坑就不用多說了。最後有個很好的抽象,事件對應狀態的轉換,那麼最後每一個模塊都可以抽象成一個狀態機,邏輯一目了然

2.搞清楚RPC,RPC適用於不同機器間通訊的協議,hadoop的RPC並不複雜,當你發現code有問題的時候,通過logRPC信息是很好的調試手段。

3.搞清楚序列化,yarn默認採用了google protoc,所以在閱讀源代碼的時候只要注意區分哪些function是序列化的,尤其是在添加一些東西的時候就要考慮是否需要支持序列化。


Hadoop大數據相關:
http://hadoop.apache.org
http://www.tongtongxue.com/tags/hadoop


hadoop,lucene是我讀過的源代碼中寫的最好的了,可以秒殺一些mvc的框架


推薦閱讀:

HDFS上小數據如何能負載均衡?
從事分散式系統、計算、hadoop 等方面工作需要哪些基礎?
為什麼 Storm 比 Hadoop 快?是由哪幾個方面決定的?
在社交網路中,如何去計算中兩個人之間的最短路徑?
Hadoop 一般用在哪些業務場景?

TAG:Java | Hadoop | Java編程 |