开发调优和资源调优是所有spark作业都要注意和遵循的基本原则,是高性能spark作业的基础;数据倾斜调优,主要解决spark作业数据倾斜的;shuffle调优,对spark作业的shuffle运行过程以及细节进行调优
1、开发调优
1、对于同一份数据如hive表,hdfs文件,只应该创建一个RDD,不能创建对个RDD代表同一份数据,在开发过程应该避免重复创建,否 则重复计算,增作业性能开销
2、尽可能复用同一个RDD,对于多个RDD的数据有重叠或包含的情况,应尽量复用一个RDD,减少RDD数量,减少算子执行的次数
3、对多次使用的RDD进行持久化:第一步优化,尽可能复用RDD,第二步优化,对一个RDD执行多次算子操作时,这个RDD本身仅被计算一次。spark中每次对一个RDD执行一个算子操作时,都会从源头计算一遍,性能很差。因此,对该RDD进行持久化,将RDD数据保存到内存或磁盘。cache()方法:使用非序列化方式将RDD数据全部尝试持久化到内存,persist()手动选择持久化级别
4、尽量避免使用shuffle类算子,spark作业运行过程中,最消耗性能的地方是shuffle过程,大量磁盘io和数据网络传输操作导致性能较差
5、使用map-side预聚合的shuffle操作
6、使用高性能算子:reduceByKey和aggregateByKey替代groupByKey;使用mapPartiton替代map;使用foreachPartition替换foreach;使用filter之后进行coalesce;使用reparationAndSortWithinPartitions替代reparation后+sort
7、广播大变量:如100m以上的大集合
8、使用kryo优化序列化性能
9、优化数据结构:java中三类类型好内存,对象、字符串、集合类型,因此尽量用字符串替换对象,原始类型替换字符串,数组替换集合类型,尽可能减少内存占用,降低GC频率
2、资源调优
spark资源参数可在spark-submit中设置
1、num-executors:执行器个数,每个spark作业运行一般设置50-100个执行器进程
2、executor-memory:每个执行器内存,4-8G
3、executor-cores:每个执行器核数,每个执行器并行执行task的能力 2-4
4、driver-memory:driver进程内存,1G,如果有collect算子将RDD数据全拉取到Driver处理,需要加大driver内存
5、spark.default.parallelism:设置每个stage默认的task数量 500-1000
6、spark.storage.meoryFraction:Rdd持久化数据在执行器内存中能占的比例,默认0.6
7、spark.shuffle.memoryFraction:shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能使用执行器内存的比例,默认0.2
3、数据倾斜调优
4、shuffle调优