天天看點

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格式檔案,使用自己的解析方式讀取資料。将該方式置為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

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。