1 序列化优化
使用高性能的序列化框架 kryo框架 大部分已经注册 如果没有注册 而是自定义的类
SparkConf conf = new SparkConf().set("spark.serializer","org.apach.spark.serializer.Kryoserializer")
那么要注册
2 数据结构优化
使用int代替UUID 使用数组等代替集合类 使用String组合代替集合类 减少包装类的使用,减少指针
使用json代替嵌套对象
3 存储
可以用cache() 存储到内存中或者通过checkpoint()存储到硬盘中
4 序列化持久化级别
对象存储到内存中可能会出现OOM 也可以将整个对象做序列化存储到硬盘
5 JVM优化
存储:Executor占百分之60 运行:task可以使用百分之40 可以调整比例 提升内存避免OOM
调整·eden 和 survive区和大小和比例
6 设置并行度
设置为core的数量的2-3倍
new SparkConf().set("spark.default.parallelism",x)
7 广播变量
所有文件一字节不差的要发送到所有节点,那么可以是用广播变量这样task和副本一对一可以变成executor和副本一对一 减少网络传输成本
8 数据本地化
9 算子
尽量不用groupByKey 而是用reduceByKey 因为reduceByKey会先在driver上预聚合,减少网络传输数据量
10 shuffle 调优
设置consolidation 减少shuffle产生的文件数量