Spark調優


一、任務調參

1.1 spark.executor.memory

executor執行分配的內存大小

1.2 spark.executor.cores

executor執行分配的核數

1.3 spark.executor.instances

需要的executor個數,等同num-executors,可以使用 spark.dynamicAllocation.enabled

1.4 spark.executor.memoryOverhead="1024m'

這個參數表示每個executor配備的可使用的堆外內存大小。在調spark應用程序時可能經常會碰到OOM,然后錯誤日志中提示讓提高這個參數指定的值的情況。這種情況其實多發生在有數據傾斜的情況,這個調整經常是治標不治本,解決傾斜是根本。默認情況是配置的executor內存容量的10%

1.5 spark.executor.extraJavaOptions

Jvm參數值,我們有時候發現我們的job突然跑的很慢,一方面可以去看看Yarn上的資源分配情況,另一方面也可以沒看看是不是有大量的時間用來做GC導致的。

例:最大的堆外內存:spark.executor.extraJavaOptions="-XX:MaxDirectMemorySize=1G"

1.6 spark.dynamicAllocation.enabled

可以避免使用spark.executor.instances或num-executors,使用動態資源分配,動態分配可以使的 Spark 的應用在有后續積壓的在等待的 task 時請求 executor,並且在空閑時釋放這些 executor

1.7 推測執行

 推測任務是指對於一個Stage里面拖后腿的Task,會在其他節點的Executor上再次啟動這個task,如果其中一個Task實例運行成功則將這個最先完成的Task的計算結果作為最終結果,同時會干掉其他Executor上運行的實例。spark推測式執行默認是關閉的,可通過spark.speculation屬性來開啟

--conf spark.speculation=true
--conf spark.speculation.interval=100
--conf spark.speculation.quantile=0.9
--conf spark.speculation.multiplier=1.5
(1)當spark.speculation設置為true時,就會對task開啟推測執行,也就是在一個stage下跑的慢的tasks有機會重新啟動;
(2)spark.speculation.interval,100ms,Spark檢測tasks推測機制的間隔時間;
(3)spark.speculation.quantile,0.9,當一個stage下多少百分比的tasks運行完畢后才開啟推測執行機制,0.9即90%的任務都運行完畢后開啟推測執行;
(4)spark.speculation.multiplier,1.5,一個task的運行時間是所有task的運行時間中位數的幾倍時,才會被認為該task需要重新啟動。

1.8 配置metastore

配置[hive/in-memory]作為metastore,默認in-memory

在寫非SQL代碼時,SparkSession初始化時默認是用in-memory,不會加載hive-site.xml,如果需要訪問元數據,需要在初始化時添加enableHiveSupport,設置metastore為hive

spark.sql.catalogImplementation="hive"

1.9 提升Shuffle計算性能

spark.shuffle.service.enabled=true

NodeManager中一個長期運行的輔助服務,用於提升Shuffle計算性能。默認為false,表示不啟用該功能。

spark.shuffle.service.port      7337

Shuffle服務監聽數據獲取請求的端口。可選配置,默認值為“7337”

1.10 動態分區

hive.exec.dynamic.partition="true"
hive.exec.dynamic.partition.mode="nonstrict"

1.11 設置類型隱式轉換

Hive 默認支持隱式轉換,Spark需要設置以下參數來有限度支持隱式轉換

spark.sql.storeAssignmentPolicy=LEGACY

1.12 小文件合並問題

Spark SQL在寫入數據的時候是並行寫入,並沒有一個合並的過程。小文件過多,會增大Namenode的壓力,同時對查詢性能也有很大影響。通常在Hive中可以引入 hive.spark.mergefiles=true 來為hive的執行計划增加一個合並Job,但Spark SQL不支持這個做法。

spark.sql.adaptive.enabled=true;    --動態調整Shuffle Partition

spark.sql.adaptive.advisoryPartitionSizeInBytes=262144000;  --合並連續的隨機播放分區,以避免執行過多的小任務。

spark.sql.adaptive.maxNumPostShufflePartitions=200;    --reduce個數區間最大值,同時也是shuffle分區數的初始值

spark.sql.adaptive.forceApply=true;            --強制開啟AQE

spark.sql.adaptive.coalescePartitions.parallelismFirst=false;  --不適用默認並行度設置

spark.sql.adaptive.coalescePartitions.minPartitionSize =52428800;  --動態合並

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM