- 資源調優
① 搭建Spark集群的時候要給Spark集群足夠的資源(core,memory)
在spark安裝包的conf下spark-env.sh
SPARK_WORKER_CORES --worker節點的可用核數
SPARK_WORKER_MEMORY
SPARK_WORKER_INSTANCE
在提交Application的時候給Application分配更多的資源。
提交命令選項:(在提交Application的時候使用選項)
--executor-cores
--executor-memory
--total-executor-cores
配置信息:(在Application的代碼中設置,在Spark-default.conf中設置)
spark.executor.cores
spark.executor.memory
spark.max.cores
- 並行度調優
原則:一個core一般分配2~3個task,每一個task一般處理1G數據(task的復雜度類似wc)
① 提高並行度的方式:
1) .如果讀取的數據在HDFS上,降低block塊的大小 2) .sc.textFile(path,numPartitions) 3) sc.parallelize(list,numPartitions) 一般用於測試 4) coalesce、repartition可以提高RDD的分區數。 5) 配置信息: spark.default.parallelism not set (默認executor core的總個數) spark.sql.shuffle.partitions 200 6) 自定義分區器
|
- 代碼調優
① 避免創建重復的RDD
val rdd1 = sc.textFile(“xxx”)
val rdd2 = sc.textFile(“xxx”)
在執行效率上沒有區別,但是代碼亂。
② 在其他的job中對於重復使用的RDD要使用持久化算子
cache:
MEMORY_ONLY
persist:
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK_SER
一般不要選擇帶有_2的持久化級別。
checkpoint:
① 如果一個RDD的計算時間比較長或者計算起來比較復雜,一般將這個RDD的計算結果保存到HDFS上,這樣數據會更加安全。
② 如果一個RDD的依賴關系非常長,也會使用checkpoint,會切斷依賴關系,提高容錯的效率。
③ 盡量使用廣播變量
使用廣播變量可以大大的降低集群中變量的副本數。
不使用廣播變量:變量的副本數和task數一致。
使用廣播變量:變量的副本數與Executor數一致。
廣播變量最大可以是多大?
ExecutorMemory*60%*90%*80%