Spark參數優化


  • 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格式文件,使用自己的解析方式讀取數據。將該方式置為falseset 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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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