溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

spark源碼閱讀基本思路是什么

發(fā)布時(shí)間:2021-12-16 20:24:40 來(lái)源:億速云 閱讀:129 作者:柒染 欄目:大數(shù)據(jù)

spark源碼閱讀基本思路是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

1.為何要閱讀源碼

浪尖以自己的經(jīng)驗(yàn)講一下為何需要閱讀源碼吧!

a.解決企業(yè)中bug。比如flink早期bug,就很多,如json序列化工具,在開(kāi)啟flink僅一次處理,json格式不符合要求,就會(huì)拋異常而掛掉,然后重試,掛掉。這明顯不科學(xué),要解決這個(gè)bug就要會(huì)讀源碼,改源碼。

bug代碼如下:

spark源碼閱讀基本思路是什么

修改后代碼如下:

spark源碼閱讀基本思路是什么

b.豐富原有框架的需求。比如spark streaming與kafka早期版本結(jié)合,是不支持動(dòng)態(tài)監(jiān)聽(tīng)新增的topic或者分區(qū)的,而企業(yè)中kafka的topic新增分區(qū)又很常見(jiàn),這時(shí)候?yàn)榱素S富功能需要改源碼,是的spark streaming能感知到kafka的topic和分區(qū)的變化。

在浪尖知識(shí)星球分享過(guò)了。

c.二次開(kāi)發(fā)做平臺(tái)。比如,浪尖最近想基于tinkerpop做知識(shí)圖譜存儲(chǔ)的框架,但是想新增一些策略,新增一個(gè)自研存儲(chǔ)層,新增一些gremlin語(yǔ)法算子,那就需要你讀懂源碼,合理規(guī)劃修改源碼。

d.學(xué)習(xí)。閱讀源碼,小了說(shuō)可以學(xué)習(xí)編程語(yǔ)言,大了說(shuō)可以學(xué)習(xí)架構(gòu)設(shè)計(jì),比如spark的rpc架構(gòu),hbase的存儲(chǔ)層架構(gòu),sparkshuffle的分治思想及演進(jìn)遠(yuǎn)離。

2.應(yīng)該從何處閱讀源碼

閱讀源碼,到底該如何閱讀呢?一個(gè)工程給你,幾千,幾萬(wàn),甚至幾十萬(wàn)代碼;一個(gè)工程幾個(gè)十幾個(gè)模塊,一下子擺到你面前,確實(shí)束手無(wú)策,無(wú)從下手。而且Scala語(yǔ)法這么隨性,Java后期lambda表達(dá)也很狂野,這樣也讓很多基礎(chǔ)不牢或者根本沒(méi)怎么做過(guò)這類(lèi)編程的人,很頭痛,看不懂,舉步維艱。

1).算子源碼閱讀。

一般的計(jì)算框架,為了方便使用,都會(huì)提供多種計(jì)算算子,而且算子又分為lazy形和action形。

對(duì)于spark lazy形算子,要理解為啥是懶執(zhí)行,action算子是如何觸發(fā)計(jì)算的?這兩個(gè)疑問(wèn)都是可以通過(guò)看對(duì)應(yīng)算子的源碼找到答案的。

比如spark sql的邏輯組織依賴(lài)的類(lèi),以下幾個(gè):

  1. dataset代表調(diào)用鏈。

  2. dataset的函數(shù)是算子

  3. 然后SparkStrategy是策略?xún)?yōu)化。

這些類(lèi),之間如何相互作用的,弄清楚之后源碼也算是閱讀懂了。

對(duì)于最近做的知識(shí)圖譜存儲(chǔ),tinkerpop也是支持這兩種類(lèi)型的算子。只不過(guò)調(diào)用關(guān)系比spark 更亂,源碼更難閱讀,因?yàn)樽⑨屢脖容^差,后面有機(jī)會(huì)給大家品評(píng)。

tinkerpop自身為了表述邏輯,有四層類(lèi):

  1. traversal,類(lèi)似于spark sql的dataset,代表迭代的順序,會(huì)形成一個(gè)調(diào)用鏈。

  2. step,就是traversal算子里傳入的函數(shù)對(duì)象,代表計(jì)算的步驟和邏輯。

  3. TraversalStrategy,類(lèi)似于spark sql的SparkStrategy,對(duì)step算子進(jìn)行優(yōu)化。

  4. traverser,該對(duì)象主要是保存tinkerpop的計(jì)算狀態(tài),及統(tǒng)計(jì)信息等。spark則沒(méi)有。

單個(gè)算子看完,其實(shí)不能解決大家的疑惑,因?yàn)閟park還有血緣關(guān)系,血緣關(guān)系其實(shí)就是spark 算子的調(diào)用鏈,如下面的:

rdd1.map(w=>(w,1)).reducebykey(_+_).take(10)

rdd之間依賴(lài)的關(guān)系分類(lèi)-窄依賴(lài)和寬依賴(lài)。如何劃分的,類(lèi)名稱(chēng)叫什么?

stage劃分,task劃分,task包裝,task調(diào)度,task執(zhí)行。應(yīng)該帶著這些疑問(wèn)去讀,一個(gè)疑問(wèn)一個(gè)疑問(wèn)的閱讀源碼,揭示迷底,這樣你才能透徹理解。

2).rpc源碼閱讀。

對(duì)于spark 的內(nèi)部通訊機(jī)制,浪尖之前也發(fā)過(guò)文章,大概有三種:

a.EventLoop 。如:DAGSchedulerEventProcessLoop,生產(chǎn)消費(fèi)的阻塞隊(duì)列機(jī)制。

b.sparkListener 。這是一種總線(xiàn)機(jī)制,spark ui的mertics都是通過(guò)這種機(jī)制獲取展示的,當(dāng)然task信息要通過(guò)nerry的rpc由executor端返回到driver端。

c.基于netty的RPC,task調(diào)度,任務(wù)返回等都是通過(guò)它的。

對(duì)于rpc閱讀,可以進(jìn)行簡(jiǎn)單了解吧,比如worker與master之間的rpc通信消息種類(lèi),executor與driver之間的rpc通信消息類(lèi)型。

這樣便于你了解,executor,driver及task的調(diào)度。

3).任務(wù)調(diào)度源碼閱讀。

任務(wù)調(diào)度源碼閱讀,主要是涵蓋stage劃分,task包裝,driver到executor的task調(diào)度,task這行。

這里閱讀的主要入口就是action算子,一步步查看調(diào)用鏈,然后利用eventloop+rpc+sparklistener,完成了整個(gè)task調(diào)度及結(jié)果信息返回的過(guò)程。

你讀源碼的時(shí)候,可以按照這幾個(gè)步驟,一步步注釋寫(xiě)文章梳理。

4).數(shù)據(jù)交互與存儲(chǔ)源碼閱讀。

對(duì)于spark來(lái)說(shuō),他的存儲(chǔ)管理層主要是blockmanager,無(wú)論是cache,shuffle,廣播變量都是考它管理的。

  1. rpc架構(gòu),主要是mapoutputtracer及其子類(lèi)。

  2. shuffle write,就是shufflemaptask的writer操作,包括排序,聚合,文件生成,溢寫(xiě)磁盤(pán)。

  3. shufflerdd,完成shuffle 讀取操作,包括并發(fā)讀取,批量讀取限制,總量限制,溢寫(xiě)磁盤(pán)文件條件,及合并實(shí)際。

5).高深的就是底層運(yùn)行環(huán)境源碼閱讀。

這里你可以帶的疑問(wèn):

  1. driver和executor如何啟動(dòng)的。

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

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

這里面可以學(xué)到很多東西的,我也錄制過(guò)視頻:java知識(shí)點(diǎn),包括:classloader,processbuilder等。

spark源碼閱讀基本思路是什么

spark源碼閱讀基本思路是什么

3.應(yīng)該如何使用工具方便的閱讀源碼

idea是一個(gè)閱讀源碼并調(diào)試的好工具。

社區(qū)版本idea查看繼承關(guān)系的騷操作

經(jīng)驗(yàn)篇:Intellij IDEA 看源碼必備的技能!

如何在IntelliJ IDEA優(yōu)雅的查看類(lèi)繼承關(guān)系...

高效開(kāi)發(fā):IntelliJ IDEA天天用,這些Debug技巧你都知道?

除了好好使用idea的工具外,也可以參考浪尖源碼閱讀視頻和文檔提供的思路,然后根據(jù)自己需要閱讀源碼。

4.需要debug源碼么

直接說(shuō),好的源碼不需要debug。比如,spark源碼閱讀,你完全沒(méi)必要debug,因?yàn)閟park架構(gòu)設(shè)計(jì),代碼風(fēng)格清晰明了,而且注釋清晰易懂,按照注釋、調(diào)用連及引用關(guān)系就可以流暢閱讀源碼。

有些必須要debug源碼,才能更好的理解。如,tinkerpop,flink源碼,注釋很挫,而且很多地方引用關(guān)系,隱藏太深,還有各種優(yōu)化策略,還有查詢(xún)及執(zhí)行邏輯不慎明了,命名規(guī)范問(wèn)題等使得直接閱讀比較困難,需要debug,梳理調(diào)用關(guān)系鏈,然后才能更好閱讀成長(zhǎng)。

調(diào)試flink源碼

一般情況,可以先自己順利源碼,然后debug驗(yàn)證自己的梳理是否正確,反之依然,二者結(jié)合,相得益彰。

最后要做到,自己關(guān)注的細(xì)節(jié)明了,運(yùn)行機(jī)制明了,這樣你才不會(huì)被調(diào)優(yōu)困擾。

閱讀源碼達(dá)到最佳的境界是:深入理解了框架的設(shè)計(jì)理念和設(shè)計(jì)細(xì)節(jié),并且能對(duì)設(shè)計(jì)細(xì)節(jié)解決的案例場(chǎng)景和不適應(yīng)的場(chǎng)景有深刻的認(rèn)識(shí)和理解。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI