- Spark没有伪分布式概念,主从节点设置全在spark-env里设置
-
基础调优
-
开发调优
-
基本原则
- 算子的合理使用
- RDD lineage设计
- 原则一:
- 避免重复创建RDD
- RDD会在每个算子过程中从头运行
- 同一个数据源尽可能只创建一个RDD,不创建多个
- 原则二:
- 尽量重用RDD
- 减少RDD的数量,从而减少算子执行的次数
- 原则三:
- RDD的持久化
- RDD持久化内存或者磁盘的策略,不需要下一个算子过程从头开始
- 对多次使用的RDD这样操作
- 持久化级别
- MEMORY_ONLY
- MEMORY_ONLY_SER
- 将RDD序列化后
- 保存到内存中
- 每个partition只是一个字节数组,大大减少了对象数量
- 降低内存着用
- 比上面的多的开销
- 序列化
- 反序列化
- MEMORY_AND_DISK
- MEMORY_AND_DISK_SER
- MEMORY_ONLY_2,MEMORY_AND_DISK_2,等等
- 上述任意一种持久化策略加上_2代表每个持久化数据备份并保存到其他节点
- 意义是容错,但性能极大降低
- 降低多少,可能不如从头一次计算
- 慎用
- 选择策略
- 默认下,性能最高
- MEMORY_ONLY
- 避免JVM的OOM内存溢出异常
- MEMORY_ONLY_SER
- 如果纯内存集别不行
- MEMORY_AND_DISK_SER策略
- 并不是MEMEORY_AND_DISK
- 序列化后的数据比较少,可以节省内存和磁盘的空间开销。
- 不建议使用结尾为_2的级别
- 除非是要求作业的高可用性
- 原则四:
- 避免shuffle的使用
- join,reducebykey,groupbykey,distinct,repartition 都会触发shuffle
- broadcast + map
- shuffle过程:
- 将分布在集群中多个节点上的同一个key,拉取到同一个节点上,进行聚合或join等操作
- 可能会发生大量的磁盘文件读写IO,数据的网络传输操作
- 原则五:
- 在shuffle前的预聚合map-side
- 每个节点本地先聚合一次相通key的
- 代替groupByKey使用
- reduceByKey
- aggregateByKey
- 原则六:
- 使用高性能算子
- 使用mapPartitions替代普通map
- mapPartitions类的算子,一次函数调用会处理一个partition所有的数据,而不是一次函数调用处理一条
- 使用foreachPartitions替代foreach
- 普通的foreach算子每次调用一条一条数据,建立数据库连接,引起多次创建和销毁表连接的操作
- 使用coalesce替代filter
- 使用repartitionAndSortWithin替代repartition与sort类操作
- 如果需要在repartition重分区之后,还要进行排序,建议直接使用
- 该算子可以一边进行重分区的shuffle操作,一边进行排序。
- 原则七:
- 广播大变量
- 原则八:
- 使用Kryo优化序列化性能
- 原则九:
- 优化数据结构
-
资源调优
- 调优概述
- Spark作业基本运行原理
- 资源倾斜调优
- 分支主题 3