對(duì)許鵬的第一印象來源于其Bolg的粗讀,最早時(shí)候更準(zhǔn)確說應(yīng)該是博文的粗略統(tǒng)計(jì)――1年零6個(gè)月完成55篇以上的博文,基本每篇都附有代碼,其中更有多篇源碼解讀博文。而在瀏覽完大量的Storm和Spark源碼閱讀后,筆者更認(rèn)定了這是位Hadoop、Spark、Storm等相關(guān)技術(shù)從業(yè)人員。然而在與許鵬本人溝通之后才發(fā)現(xiàn),其實(shí)最貼近他本人的描述正是其Blog簡介――“富貴有定數(shù),學(xué)問則無定數(shù)――求一分,便得一分?!敝哉f是貼近,因?yàn)槠渲羞€少了樂于分享的部分。
關(guān)于許鵬:花名@徽滬一郎,2000年畢業(yè)于南京郵電學(xué)院,現(xiàn)就業(yè)于愛立信上海,在UDM部門從事相關(guān)產(chǎn)品研發(fā),個(gè)人關(guān)注于Linux內(nèi)核及實(shí)時(shí)計(jì)算框架如Storm、Spark等。
正如簡介中的描述,許鵬當(dāng)下從事基于Linux的C&C++開發(fā),正如他所說的“老套、漂亮的不突出的技術(shù)”。言歸正傳,在對(duì)許鵬有了簡單的了解之后,我們一起走進(jìn)本次的主題――C程序員的修養(yǎng)、大型項(xiàng)目的源碼學(xué)習(xí),以及Spark和Storm的源碼走讀。
免費(fèi)訂閱“CSDN云計(jì)算”微信公眾號(hào),實(shí)時(shí)掌握第一手云中消息!
CSDN作為國內(nèi)最專業(yè)的云計(jì)算服務(wù)平臺(tái),提供云計(jì)算、大數(shù)據(jù)、虛擬化、數(shù)據(jù)中心、OpenStack、CloudStack、Hadoop、Spark、機(jī)器學(xué)習(xí)、智能算法等相關(guān)云計(jì)算觀點(diǎn),云計(jì)算技術(shù),云計(jì)算平臺(tái),云計(jì)算實(shí)踐,云計(jì)算產(chǎn)業(yè)資訊等服務(wù)。
以下是采訪原文:
CSDN:請(qǐng)介紹一下目前您正在從事的研究和工作內(nèi)容?
許鵬:
目前在公司UDM(User Data Management)部門,從事AAA相關(guān)的東西,用于用戶Wi-Fi接入認(rèn)證。由于產(chǎn)品需要遷移到Linux
Cluster,所以對(duì)IP Load Balance及OpenSAF都有比較深入的研究和理解。
開發(fā)是Linux平臺(tái)上的C&C++編程,常常遇到進(jìn)程Crash和內(nèi)存泄露之類的問題,于是就對(duì)GDB和Linux內(nèi)核中的Memory Management有了比較深入的學(xué)習(xí)。
OpenSAF主要解決高可用和擴(kuò)展問題。Linux內(nèi)核顯然難度很大,加上實(shí)際項(xiàng)目中并沒有需求,所以理解起來特別吃力。經(jīng)過相當(dāng)長的時(shí)間消化理解之后,終于弄明白了內(nèi)核自舉,Memory Management和Network Stack這幾個(gè)模塊。Linux內(nèi)核是我從實(shí)際工作到業(yè)余研究的一個(gè)關(guān)鍵連結(jié)點(diǎn)。內(nèi)核代碼閱讀盡管讓個(gè)人在考慮問題的時(shí)候有了一定的長進(jìn),但畢竟無法與實(shí)際工作相關(guān)聯(lián),所以熱度漸漸降低,其實(shí)就是沒能因?yàn)槎畠?nèi)核而找一份高薪工作啦。然而,Linux內(nèi)核源碼閱讀卻給我?guī)砹艘粋€(gè)非常大的收獲――學(xué)會(huì)了“自我設(shè)問,自我解答”。
于是開始搜尋新的熱點(diǎn),從2013年初開始,發(fā)覺實(shí)時(shí)數(shù)據(jù)分析很熱門,看到許多網(wǎng)絡(luò)大拿在吹捧Storm,于是就開始看Storm的源碼。Storm源碼的學(xué)習(xí)過程中主要難點(diǎn)是Clojure語言,這個(gè)過程得到了Clojure
Programming一書中文譯者徐明明的大力幫助,所以漸漸理解了Storm的框架和實(shí)現(xiàn)機(jī)理,Storm學(xué)習(xí)的時(shí)間持續(xù)了大概半年的時(shí)間。之所以轉(zhuǎn)到Spark的研究上來,是因?yàn)槁犝fApache
Spark也支持Streaming的處理,我很好奇,于是就開始了Spark的源碼研究,這中間一方面是看網(wǎng)上的資料,另一方面是自己看源碼和做小型的實(shí)驗(yàn)來驗(yàn)證猜測(cè),可以說網(wǎng)絡(luò)讓自己的學(xué)習(xí)大大的縮短。Spark的學(xué)習(xí)中大量借鑒了酆曉杰(fxjwind)和張包峰的博客,目前,我和他們都建立了良好的互動(dòng)。
CSDN:多年C和C++項(xiàng)目開發(fā)及管理,有什么經(jīng)驗(yàn)可以分享給這個(gè)領(lǐng)域的工作者?在程序員修養(yǎng)方面,他們又應(yīng)該注意什么,多學(xué)些什么,多看些什么?
許鵬:盡管從事C和C++開發(fā)多年,我還是不敢說自己非常精通。有的只是一點(diǎn)點(diǎn)的感悟和體會(huì),如果是進(jìn)行Linux平臺(tái)下的C語言開發(fā),最好還是就下面幾個(gè)問題多做一些試驗(yàn),多讀一些相關(guān)的書。
1. 程序的運(yùn)行和加載,推薦程序員的自我修養(yǎng)一書。
2. 內(nèi)存分配,推薦閱讀Ptmalloc源碼分析,無論是C還是C++程序員,這一部分是最容易踩雷的,多讀一點(diǎn)基礎(chǔ)的東西,會(huì)在解決實(shí)際問題的時(shí)候,不至于手足無措。以這些為基礎(chǔ),再結(jié)合Valgrind或Purify,相信效果會(huì)更好。
3. 多讀一點(diǎn)C和C++開發(fā)的成功產(chǎn)品,如Apache Http Server和Nginx,這樣就容易搞清楚在設(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候需要有哪些關(guān)注點(diǎn)。
4. 《深入理解計(jì)算機(jī)系統(tǒng)》真的是一本非常不錯(cuò)的書,為什么要這么說,軟件的設(shè)計(jì)還是要以物理設(shè)備支持的特性為基礎(chǔ)的,這本書讓我們?cè)贑PU的級(jí)別來進(jìn)一步思考程序設(shè)計(jì)。
若干年前,金庸群俠傳這個(gè)游戲很流行,里頭有一種武功初練稀松平常,但只要練到第10級(jí),那就比降龍十八掌還厲害。學(xué)用C和C++也是如此吧,無它,唯勤而已。
CSDN:
您談到了因?yàn)楫a(chǎn)品遷移到Linux Cluster所以深入的研究了IP Load Balance及OpenSAF,在這兩個(gè)方面有可分享給讀者的么?
許鵬: IP Load Balance這一塊主要是對(duì)ipvs和nat的升級(jí)協(xié)議rsip作了一些研究。有關(guān)這方面的資料網(wǎng)上很多,也不敢亂加評(píng)論,如果想作細(xì)致深入學(xué)習(xí)的話,以lvs ipvs作為關(guān)鍵字搜一下就可以了。熟悉ipvs最好的方式還是試驗(yàn)加源碼閱讀,其源碼已經(jīng)在Linux內(nèi)核之中,在network目錄下。
OpenSAF是SAF的開源實(shí)現(xiàn),主要目的是為了解決HA和Scalability的問題,對(duì)于電信產(chǎn)品來說,高可靠性始終是一個(gè)硬性的指標(biāo)。SAF制定了一套齊備的標(biāo)準(zhǔn),在開源實(shí)現(xiàn)方面情況變得有意思起來。OpenSAF基本上跟隨了SAF標(biāo)準(zhǔn),而其它一些則認(rèn)為標(biāo)準(zhǔn)過于龐雜,而只選取其中一部分加以深化實(shí)施,如corosync和pacemaker。
CSDN:您花了大量的時(shí)間閱讀Spark和Storm源碼,并進(jìn)行測(cè)試,對(duì)這兩個(gè)計(jì)算框架您有做過比較嗎?有什么結(jié)論可以為大家分享?
許鵬: 這是一個(gè)經(jīng)常會(huì)被提及的問題,之所以如此就是因?yàn)閮蓚€(gè)產(chǎn)品都很優(yōu)秀。Storm是專注于實(shí)時(shí)流計(jì)算的框架,在Twitter有大量成功的應(yīng)用,其整體架構(gòu)是非常易于理解的。Spark則更為通用一些,不僅支持實(shí)時(shí)流計(jì)算,也支持批處理,圖及機(jī)器學(xué)習(xí)方面的應(yīng)用。所以要對(duì)兩者進(jìn)行比較的話,我們還是將目標(biāo)縮小到流處理這一塊。
CSDN:大量開源項(xiàng)目使用和學(xué)習(xí)經(jīng)驗(yàn),您對(duì)開源運(yùn)動(dòng)怎么看?如何才能更好的學(xué)習(xí)一個(gè)開源項(xiàng)目?開源項(xiàng)目使用時(shí)又該注意些什么?
許鵬: 開源項(xiàng)目離不開大家的廣泛參與和支持,要讓一個(gè)開源項(xiàng)目取得成功,有多個(gè)方面的因素。
CSDN:能否分享一些您對(duì)當(dāng)下大數(shù)據(jù)的看法?
許鵬: 大數(shù)據(jù)要解決的兩大基本問題是“數(shù)據(jù)存儲(chǔ)”和“數(shù)據(jù)分析”,在數(shù)據(jù)存儲(chǔ)領(lǐng)域,開源實(shí)現(xiàn)方面似乎大家都已經(jīng)首肯HDFS的方式,不再懷疑。
而在數(shù)據(jù)分析的計(jì)算框架方面,目前還有大量的競爭或博弈出現(xiàn)。Spark就是一例,分析領(lǐng)域除了基于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的分析方式,還有圖計(jì)算相關(guān)和機(jī)器學(xué)習(xí)為代表的數(shù)據(jù)挖掘。顯然機(jī)器學(xué)習(xí)是一個(gè)大熱門,這一方面?zhèn)€人所知甚少,不敢胡說八道,但門檻似乎很高,數(shù)學(xué)底子一定要好,決不是簡簡單單的調(diào)用幾個(gè)API就完事了的。
云計(jì)算是大數(shù)據(jù)的支撐,雖然脫胎于虛擬化,不乏商業(yè)宣傳的味道,但是大量機(jī)器的安裝部署,如果全部使用物理機(jī)一臺(tái)臺(tái)去裝,肯定會(huì)讓人發(fā)瘋,云計(jì)算讓大規(guī)模部署和產(chǎn)品遷移變的更為簡單。
CSDN:對(duì)于閱讀源碼您有著豐富的經(jīng)驗(yàn),對(duì)想閱讀源碼又不知道如何下手的同學(xué)可否做一些分享?
許鵬: 源碼閱讀其實(shí)是一個(gè)逆向的工程,這期間必須會(huì)遇到種種問題。一般來說,我會(huì)遵循這樣一個(gè)思維范式――Problem domain→model→architecture&implementation→improvement→best practice。
1. 首先搞清楚要分析的產(chǎn)品解決的問題是什么,這個(gè)問題在哪個(gè)大的范疇里,也就是要搞清楚problem domain。一個(gè)著名的開源產(chǎn)品必定在Wikipedia上有相應(yīng)的條目,所以一開始去看wikipedia是破題的一種極好方式。
2. 清楚要分析產(chǎn)品的大體框架和關(guān)鍵性的概念,也就是理解清楚architecture和key concept。
3. 將分析的產(chǎn)品實(shí)實(shí)在在的運(yùn)行起來,我一般選擇debian或archlinux作為工作平臺(tái),它們提供了豐富的軟件包,可以很快的將東西安裝并運(yùn)行。熟悉Linux本身對(duì)于開源項(xiàng)目的源碼閱讀還是大有裨益的。
4. 修改日志級(jí)別,得到豐富的日志信息。有了這個(gè)為基礎(chǔ),再來開始真正的源碼閱讀和分析。
5. 源碼分析的時(shí)候,要始終問這幾個(gè)問題。
- 這一部分代碼是在同一個(gè)進(jìn)程中么,同一個(gè)線程中么,運(yùn)行在同一臺(tái)機(jī)器中么
- 每一個(gè)線程都要問清楚,什么時(shí)候啟動(dòng)的,什么時(shí)候停止的
- 當(dāng)前實(shí)現(xiàn)的性能如何,比如i/o, cpu, network 這個(gè)需要做相應(yīng)的測(cè)試方面的試驗(yàn)
- 當(dāng)前的解決方案還有優(yōu)化空間嗎,比如針對(duì)spark中的scheduling問題,就有sparrow的優(yōu)化機(jī)制提出
6. 碰到具體的問題一時(shí)解決不了怎么辦
7. 編程語言選擇
- 基本語法:數(shù)據(jù)類型、控制語句、函數(shù)定義
- 是否支持FP
- 多態(tài)和繼承
稍微總結(jié)一下,我想源碼分析心中要有兩幅大圖,將整體與局部很好的結(jié)合起來思考
CSDN:有什么可以補(bǔ)充給讀者的?
許鵬: 選擇自己感興趣的東西,堅(jiān)持做下去,一定會(huì)有回報(bào),誠如《一代宗師》中所說的那樣,“念念不忘,必有回響”。
編碼到底是一件技術(shù)活,還是一項(xiàng)藝術(shù)活,這是一個(gè)令人糾結(jié)的話題。
最后,感謝CSDN的采訪,謝謝那些為開源項(xiàng)目耗費(fèi)大量精力的開發(fā)者。由于本人代碼閱讀時(shí)間比較倉促,錯(cuò)誤在所難免,有不對(duì)的地方,敬請(qǐng)指出,學(xué)無先后,能者為師。
讀源碼是開源項(xiàng)目最好的學(xué)習(xí)方式,然而當(dāng)項(xiàng)目規(guī)模達(dá)到一定程度時(shí),就像許鵬所說,源碼閱讀其實(shí)是一個(gè)逆向的工程,這期間必須會(huì)遇到種種問題。這里我們?yōu)榇蠹曳窒碓S鵬的Spark和Storm源碼走讀,方便大家學(xué)習(xí)。
文/仲浩
免費(fèi)訂閱“CSDN云計(jì)算”微信公眾號(hào),實(shí)時(shí)掌握第一手云中消息!
CSDN作為國內(nèi)最專業(yè)的云計(jì)算服務(wù)平臺(tái),提供云計(jì)算、大數(shù)據(jù)、虛擬化、數(shù)據(jù)中心、OpenStack、CloudStack、Hadoop、Spark、機(jī)器學(xué)習(xí)、智能算法等相關(guān)云計(jì)算觀點(diǎn),云計(jì)算技術(shù),云計(jì)算平臺(tái),云計(jì)算實(shí)踐,云計(jì)算產(chǎn)業(yè)資訊等服務(wù)。