阅读文本大概需要 9 分钟。
之前的两篇文章
Spark 调优一瞥 | shuffle 调优
Spark 的 数据本地化
分别讲了 shuffle 的参数调优和数据本地化的调优。
本文将从以下几个方面来介绍一下 Spark 的调优。
- 资源调优
- 并行度调优
- 代码调优
- 数据本地化
- 内存调优
- shuffle 参数
- 堆外内存
- 数据倾斜 (内容较多, 下篇文章见)
资源调优
在部署集群的时候,指定资源分配的默认参数,需要在 conf 下面的 spark-env.sh 里面指定
SPARK_WORK_CORES 指定每个 worker 分配的核数
SPARK_WORK_MEMORY 指定每个 worker 分配的内存
SPARK_WORK_INSTANCES 指定每台机器启动的 worker 数量
在提交 APPLICATION 的时候,给当前的任务分配更多的资源,在 spark-submit 命令后面指定以下参数:
--executor-cores
--executor-memory
--total-executor-cores
当然也可以在配置文件 Spark-default.conf 里面配置
spark.executor.cores
spark.executor.memory
spark.max.cores
动态的分配资源
spark.dynamicAllocation.enabled true 开启动态资源分配。
并行度优化
如果读取的数据在 HDFS 上,降低 Block 的大小,相当于提高了 RDD 中 partition 的个数。
也可以直接加上参数 numPartitions 来手动的给定分区数。
也可以使用 repartitions / coalesce 算子来改变分区。
在使用 reduceByKey / groupByKey / join 的时候,也可以加上 numPartit