一:spark-submit 提交job的参数说明
示例:
spark-submit --master yarn --class xxxx --executor-cores 5 --executor-memory 5G --num-executor 4 xxx.jar
解释:
1.–executor-cores
作用: 决定了任务的并行度
假设一个任务要想运行完成需要200个task,一个cpu核数同一时间只能运行一个task,目前总核数 = executor-cores * num-executor = 5*4 = 20个
所以:同一时间只能运行20个task,那么200个task需要运行完成需要的批次 = 200/20 = 10个批次
优化:
把executor-cores 设置为10 ,则总核数提高至40个,运行完成200个task只需要 5个批次,提高效率
2.–executor-memory
作用:决定数据获取的速度
假设executor中数据量是20G,目前executor的内存大小为5G,所以executor只能保存5G数据,剩余的15G数据保存在磁盘中,所以获取数据的时候这15G数据就需要走磁盘IO
优化:
将executor的内存设置为30G , 则全部数据都可以保存在内存中,下次需要数据的时候就可以直接从内存中获取
3.–num-executor
作用:决定任务并行度和数据获取速度
优化:
适当提高executor的数量,可以充分利用集群资源,前提是集群有资源可以用
4.生成环境一般配置方式
–executor-cores 一般设置为<= 5G
–executor-memory 根据数据量大小,假如数据量为100G,那就可以把executor-memory设置为10-20G,保证executor-memory * num-executor的资源可以存放的下总数据量,同时预留部分内存,因为在处理数据过程中,会产生额外数据,内存占用空间会比开始时候高
–num-executor 设置为15左右
注意:
所有参数调优方向的前提都取决于集群的规模和数据量的大小
但是 : 一次任务事务执行所分配的总资源最好不要大于集群总资源的 1/4
避免抢占其他任务的资源
5.Driver
driver的默认内存大小是 1G
问题: 如果返回的结果数据大于 1G ,就会发生OOM内存溢出异常
一般都会设置为5-10G
设置driver的方式
1.提交任务中设置 spark-submit –driver-memory 10G 常用
2.在程序中设置 –config(“spark.driver.memory”,“10G”)
6.Collect
collect的作用:
1.触发job的计算
2.会将rdd的所有分区的数据收集起来,封装成Array,返回给Driver
注意:
项目中慎用collect算子
无可避免的时候–例如需要广播变量的时候,必须经过收集数据才能广播出去
使用原则:
1.小于 2G 的数据都可以广播出去
2.collect收集的数据不可大于driver的内存