spark调优详解
一、开发调优
1、RDD复用与持久化
2、避免使用shuffle算子
join操作,rdd1.join(rdd2)===>>>rdd较小的情况下,可以通过
broadcast传播,并通过map进行查找关联项
3、使用map-side预聚合
reduceByKey和aggregateBykey会进行预聚合
4、使用高性能算子
reduceByKey和aggregateBykey 替换groupByKey
mapPartitions 替代普通map,但要小心OOM
foreachPartitions替代foreach
filter后进行coalesce手动减少partitions数量
repartitionAndSortWithinPartitions 替代repartition和sort类操作(重 分区的shuffle和排序sort同时进行)
5、广播大变量
默认情况下,算子函数使用外部变量,复制多个副本,网络传输到每个task,使用广播功能,保证每个Executor的内存中,只驻留一份副本,从而减少副本,减小网络开销,减少Executor内存占用,降低GC频率
6、使用kryo优化序列化性能
需要注册所有要进行序列化的自定义类型
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
7、优化数据结构
在可能以及合适的场景下,使用内存占用较少的数据结构
二、资源调优
Executor内存分配
task执行编写的代码 0.2
task通过shuffle拉取上一个stage,进行聚合操作0.2
rdd持久化 0.6
num-executors 50-100个
executor-memory 4-8G比较合适
executor-cores 2-4
driver-memory 默认1G足够,需要注意collect算子将数据拉取到driver导致的OOM
spark.default.parallelism
每个stage默认task数量 ,建议是num-executors*executor-cores 的2-3倍为好,以充分利用集群资源
spark.storage.memoryFraction
持久化比例,默认0.6,如果作业由于频繁GC导致运行缓慢,意味着task执行用户代码内存不够,可以适当调低该参数
spark.shuffle.memoryFraction
0.2,如果shuffle聚合时空间不够,会溢写到磁盘,降低应用性能
三、数据倾斜调优
导致数据倾斜的算子
distinct,groupbykey,reducebykey,aggregatebykey,join,cogroup等
stage0 map,shuffle write
state1 shuffle read,groupbykey
略.
四、shuffle调优
shuffleManager
未经优化:
stage0 每个task的磁盘文件数和stage1的task数目相等
SortShuffleManager
普通运行机制
溢写之前排序,批量写入,合并磁盘文件为1个,另外还有索引文件,标识下游task数据对应在文件中的start offset和end offset位置,每个task一个磁盘文件
bypass机制
磁盘写机制不同,写机制和未经优化的一样,不会排序
五、checkpoint
1、保存元数据
应用配置,流式未崩溃之前的各种操作,未完成的batch,元数据保存到HDFS主要针对driver失败后的修复
2、流式数据
HDFS,主要针对window operation,有状态操作,失败之后,不需要将很长的历史数据重算
3、设置checkpoint周期
DStream.checkpoint(interval)一般为batch 5~10倍
4、write ahead logs
可选,促使输入数据写入checkpoint
5、零丢失
checkpoint机制,writeaheadlog,receiver缓存机制,可靠的receiver(数据接收并备份成功后发送ack)可以保证数据零丢失
附:参数设置
spark.shuffle.file.buffer
默认32k,磁盘缓冲区,调大减少io次数
spark.reducer.maxSizeInFlight
默认48M,设置shuffle read task 的buffer缓冲大小,决定每次拉取数据量
spark.shuffle.io.maxRetries
默认3,shuffle read 拉取数据时,网络异常导致失败后重试次数
spark.shuffle.io.retryWait
默认5s,重试拉取等待的时间间隔,适当调大,增加shuffle稳定性
spark.shuffle.manager
默认sort,不需要排序的话可以调整bypass或者未经优化的hashshufflemanager
spark.shuffle.sort.bypassMergeThreshold
默认200,如果read task 数小于200,write过程不会排序
spark.shuffle.consolidateFiles
默认false,使用hashShuffleManager时true能够大幅度合并write输出文件,spark.shuffle.manager 参数为hash,设置该参数true