spark1.x-性能优化策略

来源:互联网 发布:二战法国 知乎 编辑:程序博客网 时间:2024/05/19 11:48

1、使用高性能序列化类库

SparkConf().set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")conf.registerKryoClasses(Array(classOf[Counter] ))java:conf.registerKryoClasses(Counter.class)spark.kryoserializer.buffer.mb 10

2、优化数据结构

/*避免Java语法特性中所导致的额外内存的开销,比如基于指针的Java数据结构,以及包装类型。有一个关键的问题,就是优化什么数据结构?其实主要就是优化你的算子函数,内部使用到的局部数据,或者是算子函数外部的数据。都可以进行数据结构的优化。优化之后,都会减少其对内存的消耗和占用。1、优先使用数组以及字符串,而不是集合类。也就是说,优先用array,而不是ArrayList、LinkedList、HashMap等集合。比如,有个List<Integer> list = new ArrayList<Integer>(),将其替换为int[] arr = new int[]。这样的话,array既比List少了额外信息的存储开销,还能使用原始数据类型(int)来存储数据,比List中用Integer这种包装类型存储数据,要节省内存的多。还比如,通常企业级应用中的做法是,对于HashMap、List这种数据,统一用String拼接成特殊格式的字符串,比如Map<Integer, Person> persons = new HashMap<Integer, Person()。可以优化为,特殊的字符串格式:id:name,address|id:name,address...。2、避免使用多层嵌套的对象结构。比如说,public class Teacher { private List<Student> students = new ArrayList<Student>() }。就是非常不好的例子。因为Teacher类的内部又嵌套了大量的小Student对象。比如说,对于上述例子,也完全可以使用特殊的字符串来进行数据的存储。比如,用json字符串来存储数据,就是一个很好的选择。{"teacherId": 1, "teacherName": "leo", students:[{"studentId": 1, "studentName": "tom"},{"studentId":2, "studentName":"marry"}]}3、对于有些能够避免的场景,尽量使用int替代String。因为String虽然比ArrayList、HashMap等数据结构高效多了,占用内存量少多了,但是之前分析过,还是有额外信息的消耗。比如之前用String表示id,那么现在完全可以用数字类型的int,来进行替代。这里提醒,在spark应用中,id就不要用常用的uuid了,因为无法转成int,就用自增的int类型的id即可。(sdfsdfdf-234242342-sdfsfsfdfd)*/

3、对多次使用的RDD进行持久化 / Checkpoint

4、使用序列化的持久化级别

5、Java虚拟机垃圾回收调优

--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"

降低RDD缓存占比

new SparkConf().set("spark.storage.memoryFraction", "0.5")

6、提高并行度

new SparkConf().set("spark.default.parallelism", 3*executor num*cpu core num)

7、广播共享数据

8、数据本地化

spark.locality.wait3000毫秒)spark.locality.wait.nodespark.locality.wait.processspark.locality.wait.rack

9、reduceByKey和groupByKey的合理使用

10、Shuffle调优

原创粉丝点击