spark调优1
1 使用Kryo自定义序列化:kryo的性能和压缩率都比java默认的序列化算法高10倍以上,如下为使用方法,如果声明RDD为A类或者B类,在shuffle中会提升运行速度
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
sparkConf.set("spark.kryo.registrator", KryoRegistrator.class.getName());
public class KryoRegistrator implements KryoRegistrator {
@Override
public void registerClasses(Kryo kryo) {
kryo.register(A.class);
kryo.register(B.class);
}
}
2 内存调优: executor上的内存会划分成两部分:数据存储和执行计算,执行计算的内存会抢占数据存储的内存.
spark.memory.fraction:executor内存占用JVM全部内存的比例. 默认0.75
spark.memory.storageFraction: 数据存储占用executor内存的比例,默认为0.5
3 GC调优:确保 old-gen 保存长生命周期的rdd,yong-gen 保存短周期rdd,尽量避免full GC
minor-GC 太多, 调大yong-gen的比例
full-GC 太多, 说明总内存不足
4 并发度:一个CPU队列上排列 2-3个task为最好的设置
5 广播大变量:SparkContext.broadcast(), 使用broadcast会使得变量在每个worker上存储一份,不使用会使变量在一个worker上存储多份(每个计算进程一份),这样会浪费带宽和内存
6 数据本地性,如果代码和数据在同一个节点上,那么运行速度会很快,如果不在一个节点上,那么移动代码会比移动数据要快很多,数据和代码之间的距离有以下几种:
1) PROCESS_LOCAL: 数据和代码运行在同一个JVM 进程内
2)NODE_LOCAL:数据存储的HDFS的datanode和逻辑运行executor进程在同一台物理机器上,数据要进行跨进程传递
3)NO_PREF:数据和代码逻辑没有位置偏好性
4)RACK_LOCAL: 数据和代码在同一台机架上
5)ANY:数据与代码不属于同一台机架
浙公网安备 33010602011771号