一程序員在阿里HBase團(tuán)隊的所感所悟
![](http://image.woshipm.com/wp-files/img/89.jpg)
“committer為開源社區(qū)的一個光榮和義務(wù)的職務(wù)。擁有對某項目擁有直接提交代碼、代碼審核與提交、投票否決代碼、參加核心會議、決定項目未來走勢、加入committer郵件列表等多個重要權(quán)利?!?/p>
“hadoop社區(qū)的committer主要來自于兩個項目:hadoop以及hbase,幾乎是清一色來自西8區(qū)(Bay Area)的同學(xué),天梧同學(xué)的加入是第一個來自東8區(qū)的同學(xué)?!?/p>
贊賞總能讓本人激動,熟人開心,生人好奇。進(jìn)公司前,HR會和你說,“在阿里,你可以得到快速地成長”,我信了,也不乏有同學(xué)反應(yīng),“進(jìn)了公司后,自己越長越著急了”。在日復(fù)一日的工作中,兩年很短也很快,而回頭想想,不論成敗與否,未來如何,這段職業(yè)生命的開始之路,就是我人生中的第一桶金。
阿里很大,HBase團(tuán)隊很小,而我就停留在這個小小的團(tuán)隊里面,沒有出奇的經(jīng)歷,沒有精彩的故事,沒有業(yè)務(wù)上的激情澎湃,也沒有過人的牛逼之處,平淡的記錄權(quán)當(dāng)是對工作、對同事、對團(tuán)隊發(fā)展的回憶與總結(jié)。
11年4月從學(xué)校畢業(yè)后進(jìn)入了淘寶,和不少應(yīng)屆同學(xué)相比,我很幸運(yùn)地知道團(tuán)隊是做啥的,也和老板有過簡單地交流,再加上杭州待了7年,從學(xué)校切換到公司很自然,自然得工作日會去學(xué)校吃個午飯。。。
入職后,幸運(yùn)地搭上了HBase團(tuán)隊成立的班車,那時對于HBase的理解程度是“聽過”。團(tuán)隊總共三個人,畢玄、竹莊、我。畢玄是我?guī)熜郑鸬?,有一天若牛了都沒機(jī)會讓人猜猜花名來由!!我在很長一段時間后才知道他是淘寶的大牛,哈哈,又幸運(yùn)了一把,讓人羨慕的暗喜。。。牛人負(fù)責(zé)Carry,菜鳥負(fù)責(zé)輔助,所以盡管坐著第三把交椅,我也只能打打醬油,那個時候他們?nèi)豪餃贤ǖ膬?nèi)容我是簡單明了的不懂。畢玄和竹莊,兩人性格相似,謙順溫和,感受不到啥牛氣,團(tuán)隊也處于剛成立的調(diào)研測試期,沒有太多的規(guī)矩要學(xué)(不像現(xiàn)在新同學(xué)進(jìn)來的話,業(yè)務(wù)、環(huán)境、文檔等需要熟悉的東西很多。。。),他們忙著測試、部署,我也不善于搭訕,所以就默默地干著領(lǐng)的活,谷歌+百度+編碼,就是一天的工作內(nèi)容。
我的第一份活是做監(jiān)控系統(tǒng),要求很低,畢玄說能看就行了,指標(biāo)也已經(jīng)放在百科上了。沒有苛刻的用戶,一個人做東西很美好,需求、設(shè)計、開發(fā)、測試、運(yùn)維自己說了算,唯一的那么點遺憾就是和周圍的人干著兩個世界的活,還好有偉大的搜索引擎。最近也時常有人問我監(jiān)控系統(tǒng)是怎么做的,簡單地說就是在HBase代碼中植入要監(jiān)測的指標(biāo),將監(jiān)控數(shù)據(jù)發(fā)送到Ganglia,后臺另一進(jìn)程從Gmond中拉取數(shù)據(jù)持久化存儲,然后前端使用Highcharts進(jìn)行數(shù)據(jù)繪圖。為什么不直接用Ganglia,相信很多搞后端的同學(xué)都用過或用著。關(guān)于這個問題,第一,你想從監(jiān)控系統(tǒng)中得到什么;第二,Ganglia能不能滿足你的需求。
沒多久,團(tuán)隊新來了兩個實習(xí)生,之前就是研究HBase的,所以上手很快,做自動化測試和服務(wù)端計算方面的工作,話說其中的劉佳現(xiàn)在已經(jīng)是新成立公司的CTO了。這個時候開始陸續(xù)上線了HBase最初的幾個項目,像是數(shù)據(jù)魔方以及TT3,想想那時的工作真美好,專注在一塊工作上,沒有人找你,所以竹莊肯定很忙,而我雖然游離在團(tuán)隊核心工作之外,干著一個產(chǎn)品要干的活,但也不忘自己所在的廟,時常研究學(xué)習(xí)一下HBase的源碼細(xì)節(jié)。
搞了一個月,監(jiān)控系統(tǒng)第一版做好了,也給了個好評。這時,竹莊是主開發(fā),畢玄要負(fù)責(zé)運(yùn)營項目,也沒有安排HBase方面的活給我,我就自我翻新,找到了一套好的繪圖工具Highcharts+一套jqueryUI大大地改進(jìn)了一下前端,后端進(jìn)行了一些數(shù)據(jù)存儲優(yōu)化及運(yùn)維優(yōu)化,順便又開發(fā)了一套HBase運(yùn)維頁面:實時統(tǒng)計展現(xiàn)系統(tǒng)的關(guān)鍵數(shù)據(jù)及常用管理操作,差不多可以轉(zhuǎn)崗去前端工程師發(fā)展了。。。話說某次大團(tuán)隊開會的時候,老板劍英夸我能前端能后端,那是第一次工作上的喜悅,傻傻又天真的美好。。。
6月后,參加了新人培訓(xùn)百技、百淘,第一次聽到了馬總的名言,“今天是殘酷的,明天是殘酷的,后天是美好的,但是很多人都死在明天晚上”,“態(tài)度比能力重要,選擇同樣也比能力重要”。培訓(xùn)很美好:不用干活;培訓(xùn)很有意義:樹立價值觀,增強(qiáng)存在感;培訓(xùn)很愧疚:很多要做的工作落下了。
不久,團(tuán)隊加入了測試神秀和新的開發(fā)務(wù)挺、飛云,神秀的加入對整個Team以及個人都意義重大,話說“術(shù)業(yè)有專攻”,他幫我們構(gòu)建了自動化測試系統(tǒng),有了日常Hudson構(gòu)建、詳細(xì)的性能基準(zhǔn)、嚴(yán)格的異常測試,值得贊嘆的是他不僅僅是測試,和我們一起探討問題、解決問題、code review。在這個Team,我們向著共同的目標(biāo),做著不同的分工。除了日常開發(fā),飛云兼顧了Zookeeper的研究,而務(wù)挺之前從事Mysql、C方向的工作,落地了HBase跨機(jī)房容災(zāi)相關(guān)的工作。外部的競爭力可以給內(nèi)部很大的凝聚力,我們依靠著開源這顆大樹,容易想到馬總的話,“今天,HBase在公司發(fā)展好、服務(wù)好,跟我們可能無關(guān),但反之,那肯定是我們的責(zé)任”。
到了9月中,HBase也已經(jīng)從半年前的零發(fā)展到了好幾十個項目,團(tuán)隊的需求也越來越多,而我也開始改行了,重心投入到HBase的開發(fā)中,而這第一次與HBase的親密接觸是二級索引,這是一次不成功的接觸。HBase本身不支持二級索引,一般都是由業(yè)務(wù)端自己維護(hù)索引表。HBase實現(xiàn)二級索引的難點是數(shù)據(jù)一致性,因為這需要分布式事務(wù)保證。當(dāng)然我也沒有去解決分布式事務(wù)而實現(xiàn)二級索引,經(jīng)過討論,采用了異步讀取log,重放客戶端行為的方式構(gòu)建索引,這樣可以不犧牲HBase良好的寫入性能。最后開發(fā)完成了,自測性能也還行,但是沒有上線,現(xiàn)在回頭看看原因:1.異步索引對業(yè)務(wù)使用會有一定地變扭;2.修改了HBase的內(nèi)核邏輯,不利于與社區(qū)同步更新;3.客戶自己構(gòu)建索引更靈活。當(dāng)然,個人在這過程中收獲還是不小的,而HBase的二級索引目前社區(qū)還是沒有計劃及進(jìn)展,在今年的中國HADOOP大會上華為介紹的二級索引實現(xiàn)方案可能是迄今為止我見過最好的,沒有實現(xiàn)分布式事務(wù),卻保證了原數(shù)據(jù)與索引數(shù)據(jù)的強(qiáng)一致性。如果這方案那時就出來了,或許HBase的一大需求現(xiàn)在解決已久,而現(xiàn)在這一需求實現(xiàn)在我們正在開發(fā)的新項目wasp中,隨之還有SQL、事務(wù)特性。
到了10月中,隨著異常測試的投入,HBase在穩(wěn)定性、正確性方面似乎表現(xiàn)得十分脆弱,大量地issue寵幸給了我,這些case的定位及解決之于我都是對HBase的又一層理解。那段時間,我和神秀基本就撲在這些問題上,他主要通過log梳理流程,我主要通過代碼找出疑跡,有些bug,幾天幾周才能觸發(fā)一次,我們通過想象、推測、debug日志等手段加大bug重現(xiàn)的幾率,也開發(fā)了一些有用的分析工具,這過程中很大的體會是:1.問題很可能發(fā)生在你忽略的代碼處;2.概率性問題就是問題;3.原理->現(xiàn)象這是一個理解的過程,現(xiàn)象->原理,這是一個經(jīng)驗累積的過程。
隨著對代碼理解的加深,我開始嘗試選擇一個比較重要的patch,提交給開源社區(qū)。很幸運(yùn)地是,社區(qū)committer TedYu很快review了issue及patch,提出了意見,反復(fù)修改review后,最終第7個版本合并到了社區(qū)Trunk中。成功的第一次總是讓人興奮,隨著后來在社區(qū)提交patch的增多,也感受到了團(tuán)隊內(nèi)提交patch與社區(qū)提交patch的明顯不同點:1.團(tuán)隊中的patch更強(qiáng)調(diào)邏輯正確性,社區(qū)的patch更強(qiáng)調(diào)代碼規(guī)范性、可讀性,包括命名、注釋、格式等;2.社區(qū)patch帶單元測試是基本要求;4.社區(qū)patch,review很嚴(yán)格,你能從多人多方面獲益。
進(jìn)入2012年后,畢玄開始專職做T4去了,竹莊開始負(fù)責(zé)整個團(tuán)隊的運(yùn)營與管理,而我則成為了HBase的主力開發(fā),團(tuán)隊中也新加入了叔寶、天照、慕颯、濟(jì)萬、伏波、一葦,團(tuán)隊規(guī)模與業(yè)務(wù)規(guī)模相比1年前已經(jīng)擴(kuò)大了很多,內(nèi)部分工也明確起來,濟(jì)萬、慕颯、伏波著手著NamenodeHA及實時化HDFS,叔寶著手HBase的權(quán)限認(rèn)證、coprocessor研究及產(chǎn)品服務(wù),天照從專職HIVE過來兼顧了Hadoop、HBase、Hive的開發(fā),一葦成為了我們第二位測試。我們漸漸有了完善的版本發(fā)布體制,有了值班制度,有了完善的review及pre-commit機(jī)制。隨之向我咨詢的同學(xué)變多了,運(yùn)維及DBA也愛找我了,而我想說的是服務(wù)是成長的另一途徑,讓我對HBase的理解更加全面與深刻,對不足與需求更加清晰。
HBase在公司的快速發(fā)展,當(dāng)然這歸功于畢玄、竹莊,促成了我在社區(qū)上的積極活躍,提交與合并的patch漸漸變多,也與很多committer,像是Stack、TedYu、ram、larsh等混了眼熟,經(jīng)過在社區(qū)一段時間的交流后,慢慢地學(xué)會了如何英語解釋、溝通代碼上的瑣碎細(xì)節(jié),慢慢地明白了這個圈子中的短語、術(shù)語,慢慢地習(xí)慣了被質(zhì)疑,不再害怕說錯觀點,而我也開始去質(zhì)疑別人,在別人的issue上留下自己的聲音,當(dāng)然也給他們糾正過一些錯誤。記得有一段時間,華為公司的印度人committer Ram,經(jīng)常會@我,問我有沒有碰到過這個issue,或者在我的issue中讓我?guī)涂聪嗨频膇ssue。這是一段有意思的經(jīng)歷,和一群相同的人,在社區(qū)上討論著共同的問題,分享著各自的理解,和大學(xué)期間水論壇的感覺很像。。。值得一提的是有一個issue,涉及到的事務(wù)很多,前前后后總共提交了10多個版本后才合并,原因是總有人能‘挑出刺’,最后結(jié)果是那個issue的comments中水了一大坨。
或許會有同學(xué)疑問,以后的績效考核就定發(fā)文章、參加會議分享吧。這里我需要解釋一下,也給各位工作在開源系統(tǒng)上的一個權(quán)衡的建議:1.問題及需求來源于、解決于實際工作本身;2.反饋于社區(qū)可以增強(qiáng)patch的健壯性,會有很多人幫你免費review,這是最主要的;3.與同業(yè)者的近距離交流能讓人成長;4.擴(kuò)大影響,增強(qiáng)團(tuán)隊的被認(rèn)可度,維穩(wěn)在公司的發(fā)展;5.適當(dāng)?shù)姆艞墸灰速M口舌在無意義地爭議上,所以我有很多patch提交了,但沒有被合并。
進(jìn)入2012下半年,HBase的穩(wěn)定性與正確性已經(jīng)可以得到有效保證,除了繼續(xù)增強(qiáng)外,也開始進(jìn)行了對HBase的優(yōu)化工作,像是加快宕機(jī)恢復(fù)、多線程flush、動態(tài)compaction、group sync、lazy seek、coprocessor優(yōu)化等,比較值得一提的是,從社區(qū)移植過來的group sync功能讓寫的極限TPS提升了100%,這個效果連作者自己都沒在issue中提及,而我則是在一次社區(qū)代碼瀏覽中意識到這個改動的作用,“Group sync”也是我們起的名字,在很久以后的一次私人郵件中,我向TedYu提及這個特性,他尚不知道。。。動態(tài)compaction則讓運(yùn)維人員對系統(tǒng)的控制更加游刃有余,多線程Flush進(jìn)一步提升了寫的性能等等。我們的HBase版本與社區(qū)版本保持同步的原則是:1.patch盡量提交給社區(qū),減少同步社區(qū)版本時候的工作;2.社區(qū)發(fā)布大版本的時候,我們維護(hù)相應(yīng)的分支,對于小版本則只選取有用的patch打到我們的版本上。
作為一個初級碼農(nóng),在這一年的碼農(nóng)工作中,我對自己的一個總結(jié)是:1.寫代碼;2.看代碼;3.寫讓人易懂的代碼,而現(xiàn)在及很長一段時間內(nèi)都會處在第三階段。
在監(jiān)控系統(tǒng)上,團(tuán)隊新來了專職的前端人員,重構(gòu)了前端,添加了更加豐富的數(shù)據(jù)展現(xiàn),而我也改進(jìn)了后端,使得更加高效、可靠,依賴于監(jiān)控之上的報警系統(tǒng)也有了,成為團(tuán)隊內(nèi)外的常用系統(tǒng),用于監(jiān)控、報表、賬單、趨勢對比等。
到了10月份,我們啟動了新項目Wasp(阿里megastore)的開發(fā),而自己又在HBase上做兩個比較大的改動,一個是在線Merge,另一個是HBase對于大內(nèi)存的管理BucketCache,再加上日常事務(wù),有這么一個月多在社區(qū)上一直做著潛水者。直到12月中,我將這兩patch提交給社區(qū)后,Ram迅速地回應(yīng)“So you are back with a bang”,真是令人懷念的開心哈。。。
在2012年的尾聲,很榮幸地收到了Stack的committer邀請,這對個人及團(tuán)隊都是一次很大的認(rèn)可與鼓舞,或許會有人關(guān)心如何成為committer的,這個是由社區(qū)的HBase項目委員會投票決定的,而推薦及候選我就不得而知了。
路還很長,祝愿我和我的伙伴們在新的一年繼續(xù)乘風(fēng)破浪,愿每一個同學(xué)都能在自己的目標(biāo)上前進(jìn)。。
歲月靜好,學(xué)著變老,健康生活,綠色工作。
??