當前處理的數據量:
196.5 G 589.4 G /mcloud/data/datacenter/dataasset_unilever/gray/30/209/transform/3
優化前腳本:
spark-submit --class com.talkingdata.dtasset.unilever.xxx \
--master yarn-cluster \
--queue default \
--num-executors 24 \
--driver-memory 5g \
--executor-memory 13g \
--executor-cores 2 \
--conf spark.core.connection.ack.wait.timeout=600000 \
--conf spark.task.maxFailures=20 \
--conf spark.yarn.executor.memoryOverhead=3096 \
--conf spark.default.parallelism=500 \
--conf spark.sql.shuffle.partitions=500 \
--conf spark.executor.heartbeatInterval=500 \
--files /usr/local/spark/conf/core-site.xml \
--jars /home/mcloud/platform3/common-lib_2.10-1.0.13.jar,/home/mcloud/platform3/commons-pool2-2.0.jar,/home/mcloud/platform3/jedis-2.5.1.jar,/home/mcloud/platform3/data-api_2.10-1.0.8.jar,/home/mcloud/platform3/commons-lib-0.1.52.jar,/home/mcloud/alluxio-1.6.1-hadoop-2.6/client/spark/alluxio-1.6.1-spark-client.jar \
/home/xxx/jobcexxx.2.10-1.0-asset.jar \
$1
1.GC嚴重
原因:單個executor處理的數據量過大。
解決:
--executor-cores 1,
--conf spark.default.parallelism=1000 \
--conf spark.sql.shuffle.partitions=1000 \
但後來發現雖然GC時間短了,並行度還不夠大,導致執行任務很耗時,接下來會進一步優化。
當然GC還需要從JVM,參數入手進行調優,目前本文不涉及此內容,後續後調試。
2.FetchFailException/ MetadataFetchFailedException
原因:
executor內存不足導致的問題,
解決:
增加executor 內存來解決該問題。如果內存無法再增加,增加並行度也可解決此問題。
3.timeout,executor lost,task lost 等問題
原因:
因為超時導致的異常,導致超時原因很多:GC, 網絡等原因,增加下面的參數防止超時。
解決:
--conf spark.network.timeout=600 \
--conf spark.akka.timeout=600 \
--conf spark.storage.blockManagerSlaveTimeoutMs=600 \
--conf spark.shuffle.io.connectionTimeout=600 \
--conf spark.rpc.askTimeout=600 \
4.任務執行慢(並行度低)
原因:
調整為上面參數後,發現運行速度,大不如前,單個executor 執行數據過大(單個執行數據量600MB+)。
解決:
增加並行度解決問題。
--executor-cores 2 \ (因為單個executor執行數量變小了,所以可以將此值,設置為2,增加executor數量。)
--conf spark.default.parallelism=8000 \
--conf spark.sql.shuffle.partitions=8000 \
單個executor 執行數據量如下,還是可以接收的。
5.任務傾斜
原因:
如圖,有個執行時間遠比其他任務時間長,說明任務傾斜了,task傾斜原因比較多,網絡io,cpu,mem都有可能造成這個節點上的任務執行緩慢.
解決:
可以去看該節點的性能監控來分析原因。或者可以開啟spark的推測機制,開啟推測機制後如果某一臺機器的幾個task特別慢,推測機制會將任務分配到其他機器執行,最後Spark會選取最快的作為最終結果。
spark.speculation true
spark.speculation.interval 100 - 檢測週期,單位毫秒;
spark.speculation.quantile 0.75 - 完成task的百分比時啟動推測
spark.speculation.multiplier 1.5 - 比其他的慢多少倍時啟動推測。
因為此項之前沒有經過測試,所以慎用,在此次調試中就添加這些配置。
最終優化腳本:
由於數據量很大的原因,執行速度提升很大3倍,還是可以接收的,後續還會進一步優化,提升性能。
spark-submit --class com.talkingdata.dtasset.unilever.xxx \
--master yarn-cluster \
--queue default \
--num-executors 22 \
--driver-memory 5g \
--executor-memory 13g \
--executor-cores 2 \
--conf spark.core.connection.ack.wait.timeout=600000 \
--conf spark.task.maxFailures=20 \
--conf spark.yarn.executor.memoryOverhead=3096 \
--conf spark.default.parallelism=8000 \
--conf spark.sql.shuffle.partitions=8000 \
--conf spark.executor.heartbeatInterval=500 \
--conf spark.network.timeout=600 \
--conf spark.akka.timeout=600 \
--conf spark.storage.blockManagerSlaveTimeoutMs=600 \
--conf spark.shuffle.io.connectionTimeout=600 \
--conf spark.rpc.askTimeout=600 \
--files /usr/local/spark/conf/core-site.xml \
--jars /home/mcloud/platform3/common-lib_2.10-1.0.13.jar,/home/mcloud/platform3/commons-pool2-2.0.jar,/home/mcloud/platform3/jedis-2.5.1.jar,/home/mcloud/platform3/data-api_2.10-1.0.8.jar,/home/mcloud/platform3/commons-lib-0.1.52.jar,/home/mcloud/alluxio-1.6.1-hadoop-2.6/client/spark/alluxio-1.6.1-spark-client.jar \
/home/xxx/jobcexxx.2.10-1.0-asset.jar \
$1
閱讀更多 從大數據說起 的文章