根据任务需求和硬件资源,合理配置 Spark 的 executor 数量(设置--num-executors
)和 executor 配置(配置--executor-cores
,--executor-memory
)。
对于 cpu 密集型任务(多见于数据科学场景下),总的 task 并行度应该设置为总的核数(或总核数 -1 以防止系统无法响应其他任务)
对于 mem 密集型任务(多数 spark sql 作业如此),应当根据 Yarn 可分配内存合理配置单个 executor 的内存大小。注意,--executor-memory
指的是 jvm 堆内存,其实际使用的内存要视情况而定:
spark.executor.memoryOverhead
相关介绍)主要涉及两个参数
spark.default.parallelism
:影响 spark rdd 作业的并行度spark.sql.shuffle.partitions
:影响 spark sql/streaming 作业的并行度注意,上述参数仅仅是对 spark 的一个参考,并不一定保证真正的 task 数量等于设置的并行度
当数据中存在数据倾斜时,可以使用以下方法来处理:
repartition()
、groupBy()
的优化等。Spark 是一个 lazy execution 的机制。当对一个 dataframe 执行的 transformation 操作过长时,整个 dag 的链路会很长,而其中有一些部分可能是可以重复使用的,这样会有两个问题:
在这种情况下,通常有如下优化手段:
cache()
算子将计算结果临时缓存在内存persist()
算子将计算结果持久化通过以下两个参数为 driver 和 executor JVM 配置合理的参数项,比如设置 GC 算法,GC 打印等等
spark.driver.extraJavaOptions spark.executor.extraJavaOptions
Remote shuffle service 相比 Spark 原生 shuffle 有一系列的优点,包括