「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能code下能teach的全能奶爸
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
1. 起因
任务运行如何提高并发,如何有效利用资源,如何排列任务,这是spark调优的最后一道门槛,也是话费时间最长的地方,往往守着电脑看任务一点点走,很是折磨人。
2. 优化开始
2.1 任务可以运行
首先肯定需要任务能跑起来,不报错,先了解一些基本的spark-submit的参数
基础参数
- master:本地local服务器yarn, 这是大部分人的使用方式
- queue:提交任务所用的队列
- class:任务执行的主main方法
- name:任务名称
- deploy-mode:服务器上大部分都是cluster
- files:加载的一些配置文件
内存参数:
- driver-memory:每个Executor进程的内存
- num-executors:Spark作业总共要用多少个Executor进程来执行,该参数影响总内存数
- executor-cores:每个Executor进程的CPU core数量,该参数与num-executors相乘是并发度,该参数超过4个的时候容易各种出错,所以想提高并发度,还是提高num-executors数量,减少executor-memory最好,这样来保证总内存基本不变
- executor-memory:Driver进程的内存,一般广播变量大的话,需要该参数设置较大
- conf spark.default.parallelism:落盘的文件数,一般默认200,如果文件较大,需要修改该参数
- conf spark.sql.shuffle.partitions:shuffle时的分区数量,默认200,也有动态调节,如果不满足,可以手动修改
- conf spark.executor.memoryOverhead:堆外内存,可以理解成给每个executors单独的一个内存数,如果executors本身不能满足,那就会使用该内存
说一个简单的内存使用计算方法,只适合简单的计算,注意,此算法不较真。。
总内存 = (num-executors * executor-memory)+ driver-memory + (num-executors * spark.executor.memoryOverhead)
这样大概看一眼配置,就知道大概使用了多少内存,每个任务有多少内存就心中有数了
2.2 任务可以并行
当所有任务都可以运行起来后,下一步就是调优了
- 查看数据大小,选择落盘的每个文件大小
- 根据文件大小设置总内存数,根据数据量大小设置总并发数
- 根据任务执行每个task读取的文件大小来设置shuffle的分区数量
- 根据落盘是write的大小设置落盘的文件数
不断循环,来给每个任务找到一个合理的资源使用情况,然后再根据总资源进行合理的分配。
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式