問題1:reduce task數(shù)目不適合
解決方案:
需要根據(jù)實際情況調(diào)劑默許配置,調(diào)劑方式是修改參數(shù)spark.default.parallelism。通常的,reduce數(shù)目設(shè)置為core數(shù)目的2⑶倍。數(shù)量太大,造成很多小任務(wù),增加啟動任務(wù)的開消;數(shù)目太小,任務(wù)運行緩慢。所以要公道修改reduce的task數(shù)目即spark.default.parallelism
問題2:shuffle磁盤IO時間長
解決方案:
設(shè)置spark.local.dir為多個磁盤,并設(shè)置磁盤的IO速度快的磁盤,通過增加IO來優(yōu)化shuffle性能;
問題3:map|reduce數(shù)量大,造成shuffle小文件數(shù)目多
解決方案:
通過設(shè)置spark.shuffle.consolidateFiles為true,來合并shuffle中間文件,此時文件數(shù)為reduce tasks數(shù)目;
問題4:序列化時間長、結(jié)果大
解決方案:
spark默許使用JDK 自帶的ObjectOutputStream,這類方式產(chǎn)生的結(jié)果大、CPU處理時間長,可以通過設(shè)置spark.serializer為org.apache.spark.serializer.KeyoSerializer。
另外如果結(jié)果已很大,那就最好使用廣播變量方式了,結(jié)果你曉得。
問題5:單條記錄消耗大
解決方案:
使用mapPartition替換map,mapPartition是對每一個Partition進行計算,而map是對partition中的每條記錄進行計算;
問題6 : collect輸出大量結(jié)果時速度慢
解決方案:
collect源碼中是把所有的結(jié)果以1個Array的方式放在內(nèi)存中,可以直接輸出到散布式的文件系統(tǒng),然后查看文件系統(tǒng)中的內(nèi)容;
問題7: 任務(wù)履行速度傾斜
解決方案:
如果數(shù)據(jù)傾斜,1般是partition key獲得不好,可以斟酌其他的并行處理方式,并在中間加上aggregation操作;如果是Worker傾斜,例如在某些Worker上的executor履行緩慢,可以通過設(shè)置spark.speculation=true 把那些延續(xù)慢的節(jié)點去掉;
問題8: 通過量步驟的RDD操作后有很多空任務(wù)或小任務(wù)產(chǎn)生
解決方案:
使用coalesce或repartition去減少RDD中partition數(shù)量;
問題9:Spark Streaming吞吐量不高
可以設(shè)置spark.streaming.concurrentJobs
問題10:Spark Streaming 運行速度突然降落了,常常會有任務(wù)延遲和阻塞
解決方案:
這是由于我們設(shè)置job啟動interval時間間隔太短了,致使每次job在指定時間沒法正常履行完成,換句話說就是創(chuàng)建的windows窗口時間間隔太密集了;