一、查看执行计划和Spark的执行ui界面
不管是spark还是hive,不要相信自己的代码,一定要去看执行计划和spark的执行ui界面。
踩过的坑…一开始还切过hive计算,发现mapjoin不起效果,直接hint方式没用,还需要设置最小的mapjoin数据大小的参数。同时hive中不同的是,如果mapjoin分发内存溢出,那么会有备用执行stage来代替。而spark走了broadcast hash join失败了就是内存溢出就推出了。
二、分析SparkSql慢的原因
spark中分析sql慢的原因可以从以下几点出发:
1)、观察哪个stage慢;
2)、对比执行计划分析到慢的是哪段代码;
3)、慢的原因是什么;
4)、如果倾斜那么可以采用mapjoin,过滤,随机数,union等方式主要看业务;
5)、如果数据不倾斜可能是task的处理量太大导致shuffle write很大,这样就要扩大task数。
三、Spark中的mapjoin最好放一起执行
spark中mapjoin最好放一起执行。是执行顺序的问题。我上面有改几个leftjoin的位置。他这个计划是从上到下来的,多个mapjoin的话会放在一个stage运行。
四、Spark中尽量使用temp view的方式
spark中可以使用temp view的方式,节省写入hdfs和读取hdfs的过程,数据量一大主要读取至少5min已上,比较耗时,这个时候就不建议分步走临时表,会有很大的损耗。
五、重点优化策略
1. 开发调优
- 避免创建重复的RDD
- 尽可能复用同一个RDD
- 对多次使用的RDD进行持久化
- 尽量避免使用shuffle类算子
- 使用map-side预聚合的shuffle操作
- 使用高性能的算子
- 广播大变量
- 使用Kryo优化序列化性能
- 优化数据结构
2. 资源参数调优
- 运行时架构
- 运行流程
- 调优
- executor配置
- driver配置
- 并行度
- 网络超时
- 数据本地化
- JVM/gc配置
3. 数据倾斜调优
- 使用Hive ETL预处理数据
- 过滤少数导致倾斜的key
- 提高shuffle操作的并行度
- 两阶段聚合
- 将reduce join转为map join
- 使用随机前缀和扩容RDD进行join
4. Shuffle调优
- shuffle原理
- shuffle演进
- 调优
- join类型
5. 其他优化项
- 使用DataFrame/DataSet