性能调优包含 :开发调优、资源调优、数据倾斜调优、shuffle调优几个部分
参考文档:https://tech.meituan.com/2016/04/29/spark-tuning-basic.html
driver: 任务管理者,向集群申请资源,分配任务,合并数据(不是实际任务的运行之地)
executor:分布在多个节点上,实际任务的运行之地,
executor-core:每个executor中的线程数,提高task的并发程度
executor-num:在集群中申请多少executor,充分利用集群资源,提高效率
parallelism :开启参数,提高每个stage的任务数量,充分利用资源,提高并发度(task默认数量根据hdfs默认block划分,如果没有开启参数,block少的话,task任务就少,导致设置的executor-core 与 executor-num 设置的起不到作用)
数据倾斜调优:
数据倾斜的现象:大多数task执行比较快,个别task任务执行比较慢,导致整体任务执行慢
数据倾斜的原因:发生在shuffle阶段,相同的key会被shuffle 到一个task中执行,如果有个别key数据量特别大,就会导致 task执行缓慢,甚至出现内存溢出现象
数据倾斜的算子:由于发生在shuffle阶段,会触发shuffle的计算算子:distinct, join,groupbykey,reduceByKey,repatition,等
分析原因:找到执行缓慢的task所在stage,定位代码位置,找到倾斜的算子(spark-ui或 stage划分原理)stage划分原理:大多数是根据shuffle算子来划分,shuffle前stage,shuffle后一个stage。
优化:了解数据的分布,导致倾斜的key分布,抽样查看key的分布
解决方案:无非是减少数据量
1、预处理,在hive etl中 先聚合减少key的量,或者join减少 到spark算子的计算。治标不治本,再次使用数据源还会产生倾斜,hive中倾斜
2、过滤掉数据倾斜的key,
3、提高shuffle并发度,spark.sql.shuffle.partitions设置参数,提高并非度,让key分布到多个task中,减少每个task数据量(某一个key特别大时还是会出现倾斜)
4、给key增加随机数,让数据分布到不同的task中,使用groupby 不使用join
5、mapjoin 将小表加入每个节点内存(原理不产生shuffle算子)
6、单独处理大数据量key,增加随机数。给纬表key膨胀数据
7、整体膨胀纬度表key
8、group by 长尾 ,count() group by key cast(rand()*10 as int) ;sum() group by key