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:数据与代码不属于同一台机架

 

posted on 2018-09-14 03:14  钻研spark  阅读(117)  评论(0)    收藏  举报

导航