- a. 提升Spark運行
spark.sql.adaptive.enabled=true
spark的自適應執行,啟動Adaptive Execution
spark.dynamicAllocation.enabled=true
開啟動態資源分配,Spark可以根據當前作業的負載動態申請和釋放資源
spark.dynamicAllocation.maxExecutors=${numbers}
開啟動態資源分配后,同一時刻,最多可申請的executor個數,task較多時,可適當調大此引數,保證task能夠并發執行完成,縮短作業執行時間
spark.dynamicAllocation.minExecutors=3
某一時刻executor的最小個數,平臺默認設定為3,即在任何時刻,作業都會保持至少有3個及以上的executor存活,保證任務可以迅速調度
spark.sql.shuffle.partitions
JOIN或聚合等需要shuffle的操作時,設定從mapper端寫出的partition個數,類似于MR中的reducer,當partition多時,產生的檔案也會多
spark.sql.adaptive.shuffle.targetPostShuffleInputSize=67108864
當mapper端兩個partition的資料合并后資料量小于targetPostShuffleInputSize時,Spark會將兩個partition進行合并到一個reducer端進行處理,默認64m
spark.sql.adaptive.minNumPostShufflePartitions=50
當spark.sql.adaptive.enabled引數開啟后,有時會導致很多磁區被合并,為了防止磁區過少而影響性能,設定該引數,保障至少的shuffle磁區數
spark.hadoop.mapreduce.input.fileinputformat.split.maxsize=134217728
控制在ORC切分時stripe的合并處理,當幾個stripe的大小大于設定值時,會合并到一個task中處理,適當調小該值以增大讀ORC表的并發 【最小大小的控制引數
spark.hadoop.mapreduce.input.fileinputformat.split.minsize】
- b. 提升Executor執行能力
spark.executor.memory=4g
用于快取資料、代碼執行的堆記憶體以及JVM運行時需要的記憶體,設定過小容易導致OOM,而實際執行中需要的大小可以通過檔案來估算
spark.yarn.executor.memoryOverhead=1024
Spark運行還需要一些堆外記憶體,直接向系統申請,如資料傳輸時的netty等
spark.executor.cores=4
單個executor上可以同時運行的task數,該引數決定了一個executor上可以并行執行幾個task,幾個task共享同一個executor的記憶體(spark.executor.memory+spark.yarn.executor.memoryOverhead),適當提高該引數的值,可以有效增加程式的并發度,是作業執行的更快,不過同時也增加executor記憶體壓力,容易出現OOM
-
c. 其他引數
引數名稱 當前 說明/含義 spark.sql.autoBroadcastJoinThreshold 64mb 使用BroadcastJoin時候表的大小閾值(-1 則取消使用) spark.sql.broadcastTimeout 300s BroadcastJoin的等待超時的時間 spark.default.parallelism 24 指定每個stage默認的并行task數量,處理RDD時才會起作用,對Spark SQL的無效 spark.speculation true 執行任務的推測執行,這意味著如果一個或多個任務在一個階段中運行緩慢,它們將被重新啟動 spark.speculation.quantile 在特定階段啟用推測之前必須完成的部分任務,推薦0.75/0.95 spark.kryoserializer.buffer.max 64m Kryo串行緩沖區的最大允許大小(以MiB為單位),它必須大于您嘗試序列化的任何物件,并且必須小于2048m,如果在Kryo中收到“超出緩沖區限制”例外,請增加此值,推薦1024m spark.sql.hive.metastorePartitionPruning true spark.sql.hive.caseSensitiveInferenceMode INFER_AND_SAVE 不太了解,推薦使用NEVER_INFER spark.sql.optimizer.metadataOnly true 啟用僅使用表的元資料的元資料查詢優化來生成磁區列,而不是表掃描 -
d. 常見問題
- OOM記憶體溢位
Spark根據 spark.executor.memory+spark.yarn.executor.memoryOverhead的值向RM申請一個容器,當executor運行時使用的記憶體超過這個限制時,會被yarn kill掉,失敗資訊為:Container killed by YARN for exceeding memory limits. XXX of YYY physical memory used. Consider boosting spark.yarn.executor.memoryOverhead,合理的調整這兩個引數
- 小檔案數過多
當spark執行結束后,如果生成較多的小檔案可以通過hive對檔案進行合并,
rc/orc檔案: ALTER TABLE table_name CONCATENATE ;
其他檔案:指定輸出檔案大小并重寫表(insert overwrite table _name_new select * from table_name)
- spark結果與hive結果不一致
- 資料檔案欄位中存在特殊字符帶來的錯行錯列,剔除特殊字符,如: regexp_replace(name,'\n|\r|\t|\r\n|\u0001', '')
- spark為了優化讀取parquet格式檔案,使用自己的決議方式讀取資料,將該方式置為false
set spark.sql.hive.convertMetastoreParquet=false- hive中對于null和空值與spark的差異,已知的辦法是調整hive的引數:serialization.null.format 如:
alter table table_name set serdeproperties('serialization.null.format' = '');
作者:別停下思考
鏈接:https://www.jianshu.com/p/4449dce2acc7
來源:簡書
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/224940.html
標籤:大數據
上一篇:Spark性能優化指南
下一篇:Spark內核-部署模式
