最近遇到這樣一個報錯信息搬葬,記錄如下
問題描述:跑小數(shù)據(jù)量的時候沒有報錯艳悔,跑大數(shù)據(jù)量時報了這個錯
問題解決:
增加executor:
如果executor數(shù)量比較少,那么猜年,能夠并行執(zhí)行的task數(shù)量就比較少,就意味著乔外,我們的Application的并行執(zhí)行的能力就很弱。
比如有3個executor杨幼,每個executor有2個cpu core聂渊,那么同時能夠并行執(zhí)行的task四瘫,就是6個。6個執(zhí)行完以后诊胞,再換下一批6個task锹杈。增加了executor數(shù)量以后,那么竭望,就意味著,能夠并行執(zhí)行的task數(shù)量咬清,也就變多了。比如原先是6個影钉,現(xiàn)在可能可以并行執(zhí)行10個掘剪,甚至20個,100個夺谁。那么并行能力就比之前提升了數(shù)倍,數(shù)十倍蜡塌。相應的勿负,性能(執(zhí)行的速度),也能提升數(shù)倍~數(shù)十倍笆环。
增加每個executor的cpu core:
也是增加了執(zhí)行的并行能力。原本20個executor,每個才2個cpu core库菲。能夠并行執(zhí)行的task數(shù)量,
就是40個task”钋埽現(xiàn)在每個executor的cpu core溉浙,增加到了5個蒋荚。能夠并行執(zhí)行的task數(shù)量,就是100個task惊奇。執(zhí)行的速度播赁,提升了2倍左右。
增加每個executor的內(nèi)存量:
增加了內(nèi)存量以后容为,對性能的提升,有三點:
1替劈、如果需要對RDD進行cache得滤,那么更多的內(nèi)存,就可以緩存更多的數(shù)據(jù)耿戚,將更少的數(shù)據(jù)寫入磁盤,
甚至不寫入磁盤坛猪。減少了磁盤IO皂股。
2墅茉、對于shuffle操作呜呐,reduce端,會需要內(nèi)存來存放拉取的數(shù)據(jù)并進行聚合洋机。如果內(nèi)存不夠洋魂,也會寫入磁盤喜鼓。如果給executor分配更多內(nèi)存以后衔肢,就有更少的數(shù)據(jù),需要寫入磁盤角骤,甚至不需要寫入磁盤。減少了磁盤IO背桐,提升了性能胳赌。
3、對于task的執(zhí)行疑苫,可能會創(chuàng)建很多對象。如果內(nèi)存比較小捍掺,可能會頻繁導致JVM堆內(nèi)存滿了挺勿,
然后頻繁GC曲横,垃圾回收,minor GC和full GC禾嫉。(速度很慢)蚊丐。內(nèi)存加大以后,帶來更少的GC麦备,垃圾回收,
避免了速度變慢黍匾,性能提升呛梆。
結合案例
在我們在生產(chǎn)環(huán)境中,提交spark作業(yè)時填物,用的spark-submit shell腳本秀仲,里面調(diào)整對應的參數(shù)
/usr/local/spark/bin/spark-submit
--class cn.spark.sparktest.core.WordCountCluster
--num-executors 3 \ 配置executor的數(shù)量
--executor-memory 100m \ 配置每個executor的內(nèi)存大小
--executor-cores 3 \ 配置每個executor的cpu core數(shù)量
--driver-memory 100m \ 配置driver的內(nèi)存(影響很大)
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
除此之外還可以通過數(shù)據(jù)傾斜調(diào)優(yōu)、資源調(diào)優(yōu)雁刷、shuffle調(diào)優(yōu)