您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Spark基礎(chǔ)面試題有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
兩張圖一起看,左側(cè)圖是簡(jiǎn)化版,右側(cè)圖較完整。
YARN-Cluster任務(wù)提交流程:
1 由client向RM提交請(qǐng)求,并上傳jar到HDFS上 ;
2 RM選擇一個(gè)NM創(chuàng)建SparkAppMaster(AM),AM啟動(dòng)Driver(即初始化sc);
3 AM向RM申請(qǐng)資源;
4 RM給AM返回資源列表;
5 AM申請(qǐng)啟動(dòng)Executor;
6 Executor向AM反向注冊(cè);
Executor反向注冊(cè)完成后,AM就會(huì)知道自己有哪些資源可以用(Executor),然后就會(huì)去執(zhí)行job,拆分stage,提交stage的Task,進(jìn)行Task調(diào)度,分配到Executor上去執(zhí)行;
7 AM分配任務(wù)給Executor執(zhí)行,Executor執(zhí)行任務(wù),并向AM匯報(bào)運(yùn)行的狀態(tài)和進(jìn)度;
8 等到所有的任務(wù)執(zhí)行完畢后,AM 向 RM 申請(qǐng)注銷并關(guān)閉自己,釋放資源 ;
參考鏈接:https://www.jianshu.com/p/e1cf4c58ae35
Yarn模式,Spark客戶端直接連接Yarn,不需要額外構(gòu)建Spark集群。有yarn-client和yarn-cluster兩種模式,區(qū)別如下:
① 主要區(qū)別在于:Driver程序的運(yùn)行節(jié)點(diǎn)
yarn-client:Driver程序運(yùn)行在客戶端(本地),適用于交互、調(diào)試,希望立即看到app的輸出
yarn-cluster:Driver程序運(yùn)行在由RM(ResourceManager)啟動(dòng)的AP(APPMaster),適用于生產(chǎn)環(huán)境。
② Driver的位置不同導(dǎo)致的性能的差異
Yarn-client的Driver運(yùn)行在本地,通常來說本地機(jī)器和Yarn集群不在同一個(gè)機(jī)房,性能不會(huì)很好;
yarn-cluster的Driver和Yarn集群運(yùn)行在同一個(gè)機(jī)房?jī)?nèi),性能上來說會(huì)好一點(diǎn);
參考鏈接:https://www.jianshu.com/p/6f55b8412f03
2.1 未經(jīng)過優(yōu)化的HashShuffleManager
假設(shè)前提:每個(gè)Executor只有1個(gè)CPU core,也就是說,無論這個(gè)Executor上分配多少個(gè)task線程,同一時(shí)間都只能執(zhí)行一個(gè)task線程。
上游的stage的task對(duì)相同的key執(zhí)行hash算法,從而將相同的key都寫入到一個(gè)磁盤文件中,而每一個(gè)磁盤文件都只屬于下游stage的一個(gè)task。在將數(shù)據(jù)寫入磁盤之前,會(huì)先將數(shù)據(jù)寫入到內(nèi)存緩沖,當(dāng)內(nèi)存緩沖填滿之后,才會(huì)溢寫到磁盤文件中。但是這種策略的不足在于,下游有幾個(gè)task,上游的每一個(gè)task都就都需要?jiǎng)?chuàng)建幾個(gè)臨時(shí)文件,每個(gè)文件中只存儲(chǔ)key取hash之后相同的數(shù)據(jù),導(dǎo)致了當(dāng)下游的task任務(wù)過多的時(shí)候,上游會(huì)堆積大量的小文件 。
具體的過程分為“寫過程”和“讀過程”,參看上面的鏈接。
2.2 經(jīng)過優(yōu)化的HashShuffleManager
假設(shè)前提:每個(gè)Executor只有1個(gè)CPU core,也就是說,無論這個(gè)Executor上分配多少個(gè)task線程,同一時(shí)間都只能執(zhí)行一個(gè)task線程。
Shuffle Write過程:
開啟consolidate機(jī)制之后,在shuffle write過程中,task就不是為下游stage的每個(gè)task創(chuàng)建一個(gè)磁盤文件了。此時(shí)會(huì)出現(xiàn)shuffleFileGroup的概念,每個(gè)shuffleFileGroup會(huì)對(duì)應(yīng)一批磁盤文件,磁盤文件的數(shù)量與下游stage的task數(shù)量是相同的。一個(gè)Executor上有多少個(gè)CPU core,就可以并行執(zhí)行多少個(gè)task。而第一批并行執(zhí)行的每個(gè)task都會(huì)創(chuàng)建一個(gè)shuffleFileGroup,并將數(shù)據(jù)寫入對(duì)應(yīng)的磁盤文件內(nèi)。
當(dāng)Executor的CPU core執(zhí)行完一批task,接著執(zhí)行下一批task時(shí),下一批task就會(huì)復(fù)用之前已有的shuffleFileGroup,包括其中的磁盤文件。也就是說,此時(shí)task會(huì)將數(shù)據(jù)寫入已有的磁盤文件中,而不會(huì)寫入新的磁盤文件中。因此,consolidate機(jī)制允許不同的task復(fù)用同一批磁盤文件,這樣就可以有效將多個(gè)task的磁盤文件進(jìn)行一定程度上的合并,從而大幅度減少磁盤文件的數(shù)量,進(jìn)而提升shuffle write的性能。
Shuffle Read過程:
和未優(yōu)化之前的Shuffle Read過程相同。
SortShuffleManager的運(yùn)行機(jī)制主要分成兩種,一種是普通運(yùn)行機(jī)制,另一種是bypass運(yùn)行機(jī)制。當(dāng)shuffle read task的數(shù)量小于等于spark.shuffle.sort.bypassMergeThreshold參數(shù)的值時(shí)(默認(rèn)為200),就會(huì)啟用bypass機(jī)制。
2.3 SortShuffleManager普通運(yùn)行機(jī)制
Shuffle Write過程:
在該模式下,數(shù)據(jù)會(huì)先寫入一個(gè)內(nèi)存數(shù)據(jù)結(jié)構(gòu)中,此時(shí)根據(jù)不同的shuffle算子,可能選用不同的數(shù)據(jù)結(jié)構(gòu)。如果是reduceByKey這種聚合類的shuffle算子,那么會(huì)選用Map數(shù)據(jù)結(jié)構(gòu),一邊通過Map進(jìn)行聚合,一邊寫入內(nèi)存;如果是join這種普通的shuffle算子,那么會(huì)選用Array數(shù)據(jù)結(jié)構(gòu),直接寫入內(nèi)存。接著,每寫一條數(shù)據(jù)進(jìn)入內(nèi)存數(shù)據(jù)結(jié)構(gòu)之后,就會(huì)判斷一下,是否達(dá)到了某個(gè)臨界閾值。如果達(dá)到臨界閾值的話,那么就會(huì)嘗試將內(nèi)存數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)溢寫到磁盤,然后清空內(nèi)存數(shù)據(jù)結(jié)構(gòu)。
在溢寫到磁盤文件之前,會(huì)先根據(jù)key對(duì)內(nèi)存數(shù)據(jù)結(jié)構(gòu)中已有的數(shù)據(jù)進(jìn)行排序。排序過后,會(huì)分批將數(shù)據(jù)寫入磁盤文件。默認(rèn)的batch數(shù)量是10000條,也就是說,排序好的數(shù)據(jù),會(huì)以每批1萬條數(shù)據(jù)的形式分批寫入磁盤文件。寫入磁盤文件是通過Java的BufferedOutputStream實(shí)現(xiàn)的。BufferedOutputStream是Java的緩沖輸出流,首先會(huì)將數(shù)據(jù)緩沖在內(nèi)存中,當(dāng)內(nèi)存緩沖滿溢之后再一次寫入磁盤文件中,這樣可以減少磁盤IO次數(shù),提升性能。
一個(gè)task將所有數(shù)據(jù)寫入內(nèi)存數(shù)據(jù)結(jié)構(gòu)的過程中,會(huì)發(fā)生多次磁盤溢寫操作,也就會(huì)產(chǎn)生多個(gè)臨時(shí)文件。最后會(huì)將之前所有的臨時(shí)磁盤文件都進(jìn)行合并,這就是merge過程,此時(shí)會(huì)將之前所有臨時(shí)磁盤文件中的數(shù)據(jù)讀取出來,然后依次寫入最終的磁盤文件之中。此外,由于一個(gè)task就只對(duì)應(yīng)一個(gè)磁盤文件,也就意味著該task為下游stage的task準(zhǔn)備的數(shù)據(jù)都在這一個(gè)文件中,因此還會(huì)單獨(dú)寫一份索引文件,其中標(biāo)識(shí)了下游各個(gè)task的數(shù)據(jù)在文件中的start offset與end offset。
產(chǎn)生中間文件數(shù)量:SortShuffleManager由于有一個(gè)磁盤文件merge的過程,因此大大減少了文件數(shù)量。比如第一個(gè)stage有50個(gè)task,總共有10個(gè)Executor,每個(gè)Executor執(zhí)行5個(gè)task,而第二個(gè)stage有100個(gè)task。由于每個(gè)task最終只有一個(gè)磁盤文件,因此此時(shí)每個(gè)Executor上只有5個(gè)磁盤文件,所有Executor只有50個(gè)磁盤文件。
2.4 SortShuffleManager的bypass機(jī)制
Shuffle Write過程:
此時(shí)task會(huì)為每個(gè)下游task都創(chuàng)建一個(gè)臨時(shí)磁盤文件,并將數(shù)據(jù)按key進(jìn)行hash然后根據(jù)key的hash值,將key寫入對(duì)應(yīng)的磁盤文件之中。當(dāng)然,寫入磁盤文件時(shí)也是先寫入內(nèi)存緩沖,緩沖寫滿之后再溢寫到磁盤文件的。最后,同樣會(huì)將所有臨時(shí)磁盤文件都合并成一個(gè)磁盤文件,并創(chuàng)建一個(gè)單獨(dú)的索引文件。
該過程的磁盤寫機(jī)制其實(shí)跟未經(jīng)優(yōu)化的HashShuffleManager是一模一樣的,因?yàn)槎家獎(jiǎng)?chuàng)建數(shù)量驚人的磁盤文件,只是在最后會(huì)做一個(gè)磁盤文件的合并而已。因此少量的最終磁盤文件,也讓該機(jī)制相對(duì)未經(jīng)優(yōu)化的HashShuffleManager來說,shuffle read的性能會(huì)更好。
而該機(jī)制與普通SortShuffleManager運(yùn)行機(jī)制的不同在于:第一,磁盤寫機(jī)制不同;第二,不會(huì)進(jìn)行排序。也就是說,啟用該機(jī)制的最大好處在于,shuffle write過程中,不需要進(jìn)行數(shù)據(jù)的排序操作,也就節(jié)省掉了這部分的性能開銷。
“Spark基礎(chǔ)面試題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎ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)容。