您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“spark數(shù)據(jù)本地性實(shí)例分析”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
場(chǎng)景:
Spark在Driver上,對(duì)Application的每一個(gè)stage的task,進(jìn)行分配之前,都會(huì)計(jì)算出每個(gè)task要計(jì)算的是哪個(gè)分片數(shù)據(jù),RDD的某個(gè)partition;Spark的task分配算法,優(yōu)先,會(huì)希望每個(gè)task正好分配到它要計(jì)算的數(shù)據(jù)所在的節(jié)點(diǎn),這樣的話,就不用在網(wǎng)絡(luò)間傳輸數(shù)據(jù);但是呢,通常來(lái)說(shuō),有時(shí),事與愿違,可能task沒(méi)有機(jī)會(huì)分配到它的數(shù)據(jù)所在的節(jié)點(diǎn),為什么呢,可能那個(gè)節(jié)點(diǎn)的計(jì)算資源和計(jì)算能力都滿(mǎn)了;所以呢,這種時(shí)候,通常來(lái)說(shuō),Spark會(huì)等待一段時(shí)間,默認(rèn)情況下是3s鐘(不是絕對(duì)的,還有很多種情況,對(duì)不同的本地化級(jí)別,可以設(shè)置不同的等待時(shí)長(zhǎng)),默認(rèn)重試5次,到最后,實(shí)在是等待不了了,就會(huì)選擇一個(gè)比較差的本地化級(jí)別,比如說(shuō),將task分配到靠它要計(jì)算的數(shù)據(jù)所在節(jié)點(diǎn),比較近的一個(gè)節(jié)點(diǎn),然后進(jìn)行計(jì)算。
但是對(duì)于第二種情況,通常來(lái)說(shuō),肯定是要發(fā)生數(shù)據(jù)傳輸,task會(huì)通過(guò)其所在節(jié)點(diǎn)的BlockManager來(lái)獲取數(shù)據(jù),BlockManager發(fā)現(xiàn)自己本地沒(méi)有數(shù)據(jù),會(huì)通過(guò)一個(gè)getRemote()方法,通過(guò)TransferService(網(wǎng)絡(luò)數(shù)據(jù)傳輸組件)從數(shù)據(jù)所在節(jié)點(diǎn)的BlockManager中,獲取數(shù)據(jù),通過(guò)網(wǎng)絡(luò)傳輸回task所在節(jié)點(diǎn)。
對(duì)于我們來(lái)說(shuō),當(dāng)然不希望是類(lèi)似于第二種情況的了。最好的,當(dāng)然是task和數(shù)據(jù)在一個(gè)節(jié)點(diǎn)上,直接從本地executor的BlockManager中獲取數(shù)據(jù),純內(nèi)存,或者帶一點(diǎn)磁盤(pán)IO;如果要通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)的話,那么實(shí)在是,性能肯定會(huì)下降的,大量網(wǎng)絡(luò)傳輸,以及磁盤(pán)IO,都是性能的殺手。
如果可以從數(shù)據(jù)所在的位置拿到數(shù)據(jù),那就是最佳情況,直接在一個(gè)executor進(jìn)程內(nèi),走內(nèi)存速度最佳如果數(shù)據(jù)所在的機(jī)器資源被占用,超過(guò)3秒,就會(huì)放到離數(shù)據(jù)近的其他機(jī)器上面去,那樣Task任務(wù)會(huì)找它自己本地的BlockManager要數(shù)據(jù),沒(méi)有就會(huì)通過(guò)BlockManager來(lái)管附近的BlockManager就是數(shù)據(jù)所在機(jī)器的要數(shù)據(jù),可能不在一個(gè)節(jié)點(diǎn),要走網(wǎng)絡(luò)傳輸,當(dāng)然你要是說(shuō)倆個(gè)executor都在一個(gè)節(jié)點(diǎn)里面,那這種情況,也還算不錯(cuò),就在一個(gè)節(jié)點(diǎn),走進(jìn)程間數(shù)據(jù)傳輸即可
還有一種情況,最差的就是這種跨機(jī)架拉取數(shù)據(jù)的方式了。速度非常慢,對(duì)性能的影響,相當(dāng)大。
spark里面數(shù)據(jù)本地化級(jí)別都有哪幾種?
PROCESS_LOCAL:進(jìn)程本地化,代碼和數(shù)據(jù)在同一個(gè)進(jìn)程中,也就是在同一個(gè)executor中;計(jì)算數(shù)據(jù)的task由executor執(zhí)行,數(shù)據(jù)在executor的BlockManager中,性能最好。
NODE_LOCAL:節(jié)點(diǎn)本地化,代碼和數(shù)據(jù)在同一個(gè)節(jié)點(diǎn)中;比如說(shuō),數(shù)據(jù)作為一個(gè)HDFS block塊,就在節(jié)點(diǎn)上,而task在節(jié)點(diǎn)上某個(gè)executor中運(yùn)行;或者是,數(shù)據(jù)和task在一個(gè)節(jié)點(diǎn)上的不同executor中,數(shù)據(jù)需要在進(jìn)程間進(jìn)行傳輸
NO_PREF:對(duì)于task來(lái)說(shuō),數(shù)據(jù)從哪里獲取都一樣,沒(méi)有好壞之分,比如從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)
RACK_LOCAL:機(jī)架本地化,數(shù)據(jù)和task在一個(gè)機(jī)架的兩個(gè)節(jié)點(diǎn)上,數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)在節(jié)點(diǎn)之間進(jìn)行傳輸;
ANY:數(shù)據(jù)和task可能在集群中的任何地方,而且不在一個(gè)機(jī)架中,性能最差。
spark.locality.wait,默認(rèn)是3s
我們什么時(shí)候要調(diào)節(jié)這個(gè)參數(shù)?
觀察日志,spark作業(yè)的運(yùn)行日志,推薦大家在測(cè)試的時(shí)候,先用client模式,在本地就直接可以看到比較全的日志。日志里面會(huì)顯示,starting task。。。,PROCESS LOCAL、NODE LOCAL觀察大部分task的數(shù)據(jù)本地化級(jí)別。
如果大多都是PROCESS_LOCAL,那就不用調(diào)節(jié)了;如果是發(fā)現(xiàn),好多的級(jí)別都是RACK_LOCAL、ANY,那么最好就去調(diào)節(jié)一下數(shù)據(jù)本地化的等待時(shí)長(zhǎng)調(diào)節(jié)完,應(yīng)該是要反復(fù)調(diào)節(jié),每次調(diào)節(jié)完以后,再來(lái)運(yùn)行,觀察日志看看大部分的task的本地化級(jí)別有沒(méi)有提升;看看,整個(gè)spark作業(yè)的運(yùn)行時(shí)間有沒(méi)有縮短,你別本末倒置,本地化級(jí)別倒是提升了,但是因?yàn)榇罅康牡却龝r(shí)長(zhǎng),spark作業(yè)的運(yùn)行時(shí)間反而增加了,那就還是不要調(diào)節(jié)了
怎么調(diào)節(jié)?
spark.locality.wait,默認(rèn)是3s;6s,10s 默認(rèn)情況下,下面3個(gè)的等待時(shí)長(zhǎng),都是跟上面那個(gè)是一樣的,都是3s spark.locality.wait.process spark.locality.wait.node spark.locality.wait.rack new SparkConf().set("spark.locality.wait", "10")
“spark數(shù)據(jù)本地性實(shí)例分析”的內(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)容。