spark源碼閱讀基本思路

spark源碼閱讀基本思路

浪尖 浪尖聊大數據 java

1.爲什麼要閱讀源碼

浪尖以本身的經驗講一下爲什麼須要閱讀源碼吧!sql

a.解決企業中bug。好比flink早期bug,就不少,如json序列化工具,在開啓flink僅一次處理,json格式不符合要求,就會拋異常而掛掉,而後重試,掛掉。這明顯不科學,要解決這個bug就要會讀源碼,改源碼。編程

bug代碼以下:json

spark源碼閱讀基本思路

修改後代碼以下:架構

spark源碼閱讀基本思路

b.豐富原有框架的需求。好比spark streaming與kafka早期版本結合,是不支持動態監聽新增的topic或者分區的,而企業中kafka的topic新增分區又很常見,這時候爲了豐富功能須要改源碼,是的spark streaming能感知到kafka的topic和分區的變化。併發

在浪尖知識星球分享過了。框架

c.二次開發作平臺。好比,浪尖最近想基於tinkerpop作知識圖譜存儲的框架,可是想新增一些策略,新增一個自研存儲層,新增一些gremlin語法算子,那就須要你讀懂源碼,合理規劃修改源碼。jvm

d.學習。閱讀源碼,小了說能夠學習編程語言,大了說能夠學習架構設計,好比spark的rpc架構,hbase的存儲層架構,sparkshuffle的分治思想及演進遠離。編程語言

2.應該從何處閱讀源碼ide

閱讀源碼,到底該如何閱讀呢?一個工程給你,幾千,幾萬,甚至幾十萬代碼;一個工程幾個十幾個模塊,一會兒擺到你面前,確實一籌莫展,無從下手。並且Scala語法這麼隨性,Java後期lambda表達也很狂野,這樣也讓不少基礎不牢或者根本沒怎麼作過這類編程的人,很頭痛,看不懂,舉步維艱。

1).算子源碼閱讀。

通常的計算框架,爲了方便使用,都會提供多種計算算子,並且算子又分爲lazy形和action形。

對於spark lazy形算子,要理解爲啥是懶執行,action算子是如何觸發計算的?這兩個疑問都是能夠經過看對應算子的源碼找到答案的。

好比spark sql的邏輯組織依賴的類,如下幾個:

  1. dataset表明調用鏈。

  2. dataset的函數是算子

  3. 而後SparkStrategy是策略優化。

這些類,之間如何相互做用的,弄清楚以後源碼也算是閱讀懂了。

對於最近作的知識圖譜存儲,tinkerpop也是支持這兩種類型的算子。只不過調用關係比spark 更亂,源碼更難閱讀,由於註釋也比較差,後面有機會給你們品評。

tinkerpop自身爲了表述邏輯,有四層類:

  1. traversal,相似於spark sql的dataset,表明迭代的順序,會造成一個調用鏈。

  2. step,就是traversal算子裏傳入的函數對象,表明計算的步驟和邏輯。

  3. TraversalStrategy,相似於spark sql的SparkStrategy,對step算子進行優化。

  4. 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,廣播變量都是考它管理的。

  1. rpc架構,主要是mapoutputtracer及其子類。

  2. shuffle write,就是shufflemaptask的writer操做,包括排序,聚合,文件生成,溢寫磁盤。

  3. shufflerdd,完成shuffle 讀取操做,包括併發讀取,批量讀取限制,總量限制,溢寫磁盤文件條件,及合併實際。

5).高深的就是底層運行環境源碼閱讀。

這裏你能夠帶的疑問:

  1. driver和executor如何啓動的。

  2. --jars等配置是如何配置生效的。

  3. driver和excutor的jvm參數如何配置生效的。

這裏面能夠學到不少東西的,我也錄製過視頻:java知識點,包括:classloader,processbuilder等。

spark源碼閱讀基本思路

spark源碼閱讀基本思路

3.應該如何使用工具方便的閱讀源碼

idea是一個閱讀源碼並調試的好工具。

社區版本idea查看繼承關係的騷操做

經驗篇:Intellij IDEA 看源碼必備的技能!

如何在IntelliJ IDEA優雅的查看類繼承關係...

高效開發:IntelliJ IDEA每天用,這些Debug技巧你都知道?

除了好好使用idea的工具外,也能夠參考浪尖源碼閱讀視頻和文檔提供的思路,而後根據本身須要閱讀源碼。

4.須要debug源碼麼

直接說,好的源碼不須要debug。好比,spark源碼閱讀,你徹底不必debug,由於spark架構設計,代碼風格清晰明瞭,並且註釋清晰易懂,按照註釋、調用連及引用關係就能夠流暢閱讀源碼。

有些必需要debug源碼,才能更好的理解。如,tinkerpop,flink源碼,註釋很挫,並且不少地方引用關係,隱藏太深,還有各類優化策略,還有查詢及執行邏輯不慎明瞭,命名規範問題等使得直接閱讀比較困難,須要debug,梳理調用關係鏈,而後才能更好閱讀成長。

調試flink源碼

通常狀況,能夠先本身順利源碼,而後debug驗證本身的梳理是否正確,反之依然,兩者結合,相得益彰。

最後要作到,本身關注的細節明瞭,運行機制明瞭,這樣你纔不會被調優困擾。

閱讀源碼達到最佳的境界是:深刻理解了框架的設計理念和設計細節,而且能對設計細節解決的案例場景和不適應的場景有深入的認識和理解。

相關文章
相關標籤/搜索