Spark程序优化手段,从3方面入手:
* 资源参数调整
* 程序中资源调整
* 程序语法调整
1. 资源参数调整 一般是调整spark-submit 资源参数
记住以下1个原则:
executor-cores 每个 executor 的最大核数。根据经验实践,设定在 3~6 之间比较合理;
比如:7台机器,每台128g 32c的资源配置;
(1) num-executors 估算
每台机器最大可用vcores 按28算(不能32c全用,留点冗余给系统用),
每个executor 的executor-cores 按4算(3~6 之间),
这台机器的executor 数就是 28/4 = 7 个;
一共有7台机器。那么这个spark集群,最多可以有num-executors 是7*7=49个
(2)executor-memory 估算
每台机器最大可用内存按100g 算(不能128g全用,留点冗余给系统用),
每台机器的最大executor数是7个 那么,每个executor的内存executor-memory是100/7 = 14g;
注意这个估算的14g 不能超过 yarn 配置中每个容器允许的最大内存;超过spark任务会失败;
2.程序中资源调整,主要是调整spark 算子的并行度
记住以下一个原则:
如果想要让任务运行的最快当然是一个 task 对应一个 vcore,但 是一般不会这样设置,为了合理利用资源,一般会将并行度(task 数)设置成并发度 (vcore 数)的 2 倍到 3 倍
在代码中调整必要算子的并行度
(1) sparksql spark.sql.shuffle.partitions(默认 200)
修改参数 spark.sql.shuffle.partitions, 根据我们啥上面任务的提交参数集群有49 * 4个核,
将此参数设置为 49 * 4 * 2 ~ 49 * 4 * 3 为最优效果;
...未完待续