2019-03-05 SparkSQL集群性能調(diào)優(yōu) CheatSheet

0.買高性能機(jī)器,增加節(jié)點

1.設(shè)置磁盤文件預(yù)讀值大小為16384,使用linux命令:

echo 16384 > /sys/block/{磁盤名}/queue/read_ahead_kb

2. Spark 任務(wù)序列化只支持JavaSerializer,數(shù)據(jù)序列化支持JavaSerializer和KryoSerializer。KryoSerializer能達(dá)到JavaSerializer的十倍。

3.在spark.driver.extraJavaOptions和spark.executor.extraJavaOptions配置項中添加參數(shù):"-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps",如果頻繁出現(xiàn)Full GC,需要優(yōu)化GC。把RDD做Cache操作,通過日志查看RDD在內(nèi)存中的大小,如果數(shù)據(jù)太大,需要改變RDD的存儲級別來優(yōu)化。

4.一般并行度設(shè)置為集群CPU總和的2-3倍

5.大表和小表做join操作時可以把小表Broadcast到各個節(jié)點,從而就可以把join操作轉(zhuǎn)變成普通的操作,減少了shuffle操作。

6. 合理設(shè)計DAG,減少shuffle? //TODO

7.使用mapPartitions可以更靈活地操作數(shù)據(jù),例如對一個很大的數(shù)據(jù)求TopN,當(dāng)N不是很大時,可以先使用mapPartitions對每個partition求TopN,collect結(jié)果到本地之后再做排序取TopN。這樣相比直接對全量數(shù)據(jù)做排序取TopN效率要高很多。


8.當(dāng)之前的操作有很多filter時,使用coalesce減少空運行的任務(wù)數(shù)量

9.當(dāng)任務(wù)數(shù)過大時候Shuffle壓力太大導(dǎo)致程序掛住不動,或者出現(xiàn)linux資源受限的問題。此時需要對數(shù)據(jù)重新進(jìn)行分區(qū),使用repartition

10.配置多個磁盤給localDir,shuffle時寫入數(shù)據(jù)速度增快

11. 別collect大數(shù)據(jù)量,數(shù)據(jù)會回到driver端,容易OOM。非要collect,請配置spark.sql.bigdata.thriftServer.useHdfsCollect 為true,會存在hdfs再讀

12.盡量用reduceByKey,會在Map端做本地聚合

13. broadcase?set/map而不是Iterator, set/map 查詢效率O(1) ,iteratorO(n)

14.?數(shù)據(jù)發(fā)生傾斜,repartition大法 ,查出key,salt it

15.使用Hash Shuffle時,通過設(shè)置spark.shuffle.consolidateFiles為true,來合并shuffle中間文件,減少shuffle文件的數(shù)量,減少文件IO操作以提升性能

16.Spark SQL 小表join,把小表broadcast出去。配置spark.sql.autoBroadcastJoinThresholdspark.sql.bigdata.useExecutorBroadcast。小表在join 右端。

17.SparkSQL數(shù)據(jù)傾斜,配置spark.sql.planner.skewJoinspark.sql.planner.skewJoin.threshold

18. SparkSQL 小文件,配置 spark.sql.small.file.combine 和?spark.sql.small.file.split.size

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容