- 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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。