spark源碼閱讀基本思路是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1.為何要閱讀源碼
浪尖以自己的經驗講一下為何需要閱讀源碼吧!
a.解決企業中bug。比如flink早期bug,就很多,如json序列化工具,在開啟flink僅一次處理,json格式不符合要求,就會拋異常而掛掉,然后重試,掛掉。這明顯不科學,要解決這個bug就要會讀源碼,改源碼。
bug代碼如下:
修改后代碼如下:
b.豐富原有框架的需求。比如spark streaming與kafka早期版本結合,是不支持動態監聽新增的topic或者分區的,而企業中kafka的topic新增分區又很常見,這時候為了豐富功能需要改源碼,是的spark streaming能感知到kafka的topic和分區的變化。
在浪尖知識星球分享過了。
c.二次開發做平臺。比如,浪尖最近想基于tinkerpop做知識圖譜存儲的框架,但是想新增一些策略,新增一個自研存儲層,新增一些gremlin語法算子,那就需要你讀懂源碼,合理規劃修改源碼。
d.學習。閱讀源碼,小了說可以學習編程語言,大了說可以學習架構設計,比如spark的rpc架構,hbase的存儲層架構,sparkshuffle的分治思想及演進遠離。
2.應該從何處閱讀源碼
閱讀源碼,到底該如何閱讀呢?一個工程給你,幾千,幾萬,甚至幾十萬代碼;一個工程幾個十幾個模塊,一下子擺到你面前,確實束手無策,無從下手。而且Scala語法這么隨性,Java后期lambda表達也很狂野,這樣也讓很多基礎不牢或者根本沒怎么做過這類編程的人,很頭痛,看不懂,舉步維艱。
1).算子源碼閱讀。
一般的計算框架,為了方便使用,都會提供多種計算算子,而且算子又分為lazy形和action形。
對于spark lazy形算子,要理解為啥是懶執行,action算子是如何觸發計算的?這兩個疑問都是可以通過看對應算子的源碼找到答案的。
比如spark sql的邏輯組織依賴的類,以下幾個:
dataset代表調用鏈。
dataset的函數是算子
然后SparkStrategy是策略優化。
這些類,之間如何相互作用的,弄清楚之后源碼也算是閱讀懂了。
對于最近做的知識圖譜存儲,tinkerpop也是支持這兩種類型的算子。只不過調用關系比spark 更亂,源碼更難閱讀,因為注釋也比較差,后面有機會給大家品評。
tinkerpop自身為了表述邏輯,有四層類:
traversal,類似于spark sql的dataset,代表迭代的順序,會形成一個調用鏈。
step,就是traversal算子里傳入的函數對象,代表計算的步驟和邏輯。
TraversalStrategy,類似于spark sql的SparkStrategy,對step算子進行優化。
traverser,該對象主要是保存tinkerpop的計算狀態,及統計信息等。spark則沒有。
單個算子看完,其實不能解決大家的疑惑,因為spark還有血緣關系,血緣關系其實就是spark 算子的調用鏈,如下面的:
rdd1.map(w=>(w,1)).reducebykey(_+_).take(10)
rdd之間依賴的關系分類-窄依賴和寬依賴。如何劃分的,類名稱叫什么?
stage劃分,task劃分,task包裝,task調度,task執行。應該帶著這些疑問去讀,一個疑問一個疑問的閱讀源碼,揭示迷底,這樣你才能透徹理解。
2).rpc源碼閱讀。
對于spark 的內部通訊機制,浪尖之前也發過文章,大概有三種:
a.EventLoop 。如:DAGSchedulerEventProcessLoop,生產消費的阻塞隊列機制。
b.sparkListener 。這是一種總線機制,spark ui的mertics都是通過這種機制獲取展示的,當然task信息要通過nerry的rpc由executor端返回到driver端。
c.基于netty的RPC,task調度,任務返回等都是通過它的。
對于rpc閱讀,可以進行簡單了解吧,比如worker與master之間的rpc通信消息種類,executor與driver之間的rpc通信消息類型。
這樣便于你了解,executor,driver及task的調度。
3).任務調度源碼閱讀。
任務調度源碼閱讀,主要是涵蓋stage劃分,task包裝,driver到executor的task調度,task這行。
這里閱讀的主要入口就是action算子,一步步查看調用鏈,然后利用eventloop+rpc+sparklistener,完成了整個task調度及結果信息返回的過程。
你讀源碼的時候,可以按照這幾個步驟,一步步注釋寫文章梳理。
4).數據交互與存儲源碼閱讀。
對于spark來說,他的存儲管理層主要是blockmanager,無論是cache,shuffle,廣播變量都是考它管理的。
rpc架構,主要是mapoutputtracer及其子類。
shuffle write,就是shufflemaptask的writer操作,包括排序,聚合,文件生成,溢寫磁盤。
shufflerdd,完成shuffle 讀取操作,包括并發讀取,批量讀取限制,總量限制,溢寫磁盤文件條件,及合并實際。
5).高深的就是底層運行環境源碼閱讀。
這里你可以帶的疑問:
driver和executor如何啟動的。
--jars等配置是如何配置生效的。
driver和excutor的jvm參數如何配置生效的。
這里面可以學到很多東西的,我也錄制過視頻:java知識點,包括:classloader,processbuilder等。
3.應該如何使用工具方便的閱讀源碼
idea是一個閱讀源碼并調試的好工具。
社區版本idea查看繼承關系的騷操作
經驗篇:Intellij IDEA 看源碼必備的技能!
如何在IntelliJ IDEA優雅的查看類繼承關系...
高效開發:IntelliJ IDEA天天用,這些Debug技巧你都知道?
除了好好使用idea的工具外,也可以參考浪尖源碼閱讀視頻和文檔提供的思路,然后根據自己需要閱讀源碼。
4.需要debug源碼么
直接說,好的源碼不需要debug。比如,spark源碼閱讀,你完全沒必要debug,因為spark架構設計,代碼風格清晰明了,而且注釋清晰易懂,按照注釋、調用連及引用關系就可以流暢閱讀源碼。
有些必須要debug源碼,才能更好的理解。如,tinkerpop,flink源碼,注釋很挫,而且很多地方引用關系,隱藏太深,還有各種優化策略,還有查詢及執行邏輯不慎明了,命名規范問題等使得直接閱讀比較困難,需要debug,梳理調用關系鏈,然后才能更好閱讀成長。
調試flink源碼
一般情況,可以先自己順利源碼,然后debug驗證自己的梳理是否正確,反之依然,二者結合,相得益彰。
最后要做到,自己關注的細節明了,運行機制明了,這樣你才不會被調優困擾。
閱讀源碼達到最佳的境界是:深入理解了框架的設計理念和設計細節,并且能對設計細節解決的案例場景和不適應的場景有深刻的認識和理解。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。