Spark笔记(3)-Spark程序调优

对于一个Spark程序,采用不同的优化,运行效率差别很大,下面是对Spark程序调优进行总结,分三个部分:


优化Spark运行环境

1. 防止不必要的jar包上传于分发

2. 提高数据本地性

   解决方法:计算与存储同节点部署、增加executor数目、增加数据副本数

3. 存储格式选择

    选择列式存储:减少读IO量,占用存储空间少(压缩比高)


优化RDD操作符的使用方法

1. 过滤操作导致产生很多小任务

   解决方法:对数据过滤后,使用coalesce操作符合并若干分片(Partition)

2. 降低单条记录处理开销

   解决方法:使用mapPartitions或mapWith操作符

3. 数据倾斜或任务倾斜

   解决方法:选择合理的Partition key、克服慢节点导致任务运行缓慢(慢节点磁盘老化,负载过重等):将存在问题的节点从集群中剔除

4. 对复用的RDD进行缓存

   解决方法:使用cache操作符

5. 对操作符的选择 

   避免使用笛卡尔积(Cartesian)

   尽可能避免shuffle操作

   尽量用reduceByKey代替groupByKey

   用treeReduce代替reduce


参数调优

1. 设置合适的资源量

    Executor个数(core总数应小于Task数目),Excutor的内存,Excutor的并发任务数,Driver的内存(如果用到broadcast,是要适当调大Driver内存)

2. 设置合理的JVM参数

    包括内存参数、Log4j以及lib路径参数、定制化JDK版本

3. 启用更高效的序列化方法

    默认采用Java序列化方法,速度缓慢,建议启用Kyro序列化方法:将spark.serializer设为org.apache.spark.serializer.KryoSerializer,缺点是兼容性差

4. 增大off heap内存大小(默认memory*0.1)

5. shuffle参数调优

    Reduce Task数目较多时,选择Sort-based实现(默认实现)

6. 设置Reduce Task数目

    数目过小,运行过慢,且可能导致OOM,数目过大,产生较多的小人物,启动和调度开销增大

    显式设置方法:rdd.groupByKey(100);rdd.reduceByKey(_+_,100)

你可能感兴趣的:(Spark学习笔记)