免費(fèi)的行情網(wǎng)站app網(wǎng)頁(yè)推薦企業(yè)網(wǎng)站的域名是該企業(yè)的
數(shù)據(jù)傾斜是:多個(gè)分區(qū)中,某個(gè)分區(qū)的數(shù)據(jù)比其他分區(qū)的數(shù)據(jù)多的多
數(shù)據(jù)傾斜導(dǎo)致的問(wèn)題:
- 導(dǎo)致某個(gè)spark任務(wù)耗時(shí)較長(zhǎng),導(dǎo)致整個(gè)任務(wù)耗時(shí)增加,甚至出現(xiàn)OOM
- 運(yùn)行速度慢:主要發(fā)生在shuffle階段,同樣的key的數(shù)據(jù)太多了,導(dǎo)致了某個(gè)key所在的task需要處理的數(shù)據(jù)量太大了,遠(yuǎn)超其他的task的處理時(shí)間
一條經(jīng)驗(yàn):一般出現(xiàn)運(yùn)行速度異常慢,或者OOM的主要原因是數(shù)據(jù)傾斜
數(shù)據(jù)傾斜的解決方案:
- 過(guò)濾不需要的key:有些key是臟數(shù)據(jù),直接過(guò)濾,降低數(shù)據(jù)量
- 調(diào)整并行度:增大partition的數(shù)量,這個(gè)每個(gè)task要處理的數(shù)據(jù)量就降低了,各個(gè)key可以均勻的分配到多個(gè)partition中。但是如果某個(gè)key的數(shù)據(jù)量就是很多,還是會(huì)出現(xiàn)數(shù)據(jù)傾斜
- 將reduce側(cè)的join轉(zhuǎn)化為map側(cè)join:如用reduceBykey來(lái)替換groupByKey,讓map側(cè)也發(fā)生aggr聚合,減少shuffle的數(shù)據(jù)量
- 隨機(jī)前綴擴(kuò)容:如果某個(gè)key就是很多,在此key之前加隨機(jī)數(shù),來(lái)打散key,然后聚合
- 如果在加載數(shù)據(jù)時(shí)就發(fā)生了數(shù)據(jù)傾斜,可以在加載后進(jìn)行repartition
- 對(duì)于join數(shù)據(jù)傾斜,一般是小表join大表,用map join ,避免reduce join(shuffle join)
總結(jié):一般在shuffle時(shí)容易發(fā)生數(shù)據(jù)傾斜,因此主要思路是降低shuffle的量
spark的map join 和reduce join的區(qū)別?
都是將2個(gè)數(shù)據(jù)集進(jìn)行join連接的操作,但是實(shí)現(xiàn)方式不同
- map join:小表join 大表, 將小表通過(guò)廣播的方式,廣播到所有excutors節(jié)點(diǎn)的內(nèi)存中,然后在每個(gè)excutor節(jié)點(diǎn)上將大數(shù)據(jù)和小數(shù)據(jù)進(jìn)行連接,這樣可以快速連接,從而提高了join的效率;優(yōu)點(diǎn):由于將小數(shù)據(jù)加載到內(nèi)存中,join的速度很快;缺點(diǎn):由于數(shù)據(jù)會(huì)加載到內(nèi)存中,會(huì)導(dǎo)致內(nèi)存溢出的問(wèn)題。
- reduce join : 大表join大表, 將2個(gè)數(shù)據(jù)集都進(jìn)行分區(qū),然后將相同的key的數(shù)據(jù)分發(fā)到同一個(gè)節(jié)點(diǎn)上進(jìn)行連接操作。因?yàn)橥粋€(gè)key的數(shù)據(jù)被分發(fā)到同一個(gè)節(jié)點(diǎn)上,所以每個(gè)節(jié)點(diǎn)只需要處理一部分?jǐn)?shù)據(jù),從而減少了每個(gè)節(jié)點(diǎn)需要處理的數(shù)據(jù)量,提高了join的效率;優(yōu)點(diǎn):通過(guò)分布式的方式能夠處理大數(shù)據(jù)集; 缺點(diǎn):需要進(jìn)行shuffle網(wǎng)絡(luò)傳輸,如果傳輸速度較慢,可能會(huì)導(dǎo)致連接操作的效率較低。