Spark調優實戰-調試的進階手段

當前處理的數據量:

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

Spark調優實戰-調試的進階手段

原因:

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.任務執行慢(並行度低)

Spark調優實戰-調試的進階手段

原因:

調整為上面參數後,發現運行速度,大不如前,單個executor 執行數據過大(單個執行數據量600MB+)。

解決:

增加並行度解決問題。

--executor-cores 2 \ (因為單個executor執行數量變小了,所以可以將此值,設置為2,增加executor數量。)

--conf spark.default.parallelism=8000 \

--conf spark.sql.shuffle.partitions=8000 \

單個executor 執行數據量如下,還是可以接收的。

5.任務傾斜

Spark調優實戰-調試的進階手段

原因:

如圖,有個執行時間遠比其他任務時間長,說明任務傾斜了,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


分享到:


相關文章: