倾斜问题的处理策略
场景1: join关联key为空/异常导致的倾斜
采样方法
- 百分比采样
- 随机采样
- 重分区后进行limit采样
处理思路
- 对于关联key为空的情况,可将其映射为一个随机值,然后与另一个表的key进行匹配
- 对于热点数据,可以使用case when语句进行处理
- 也可以使用union all合并结果
场景2: group by倾斜
处理思路
- 可以使用局部聚合伪combiner或从粒度出发的方法进行处理
- 可以通过设置一些参数来实现负载均衡,如设置hive.map.aggr参数或hive.groupby.mapaggr.checkinterval参数来控制map聚合行数的阈值
场景3: count distinct倾斜
处理思路
- 可以通过过滤结果中的空值并加1来处理count distinct倾斜的问题
- 如果包括group by操作,可以单独处理记录为空的情况,最后用union all将结果合并
场景4: join大表join小表
处理思路
- 可能是由于key分布不均匀导致的倾斜问题,可以考虑使用map join自动开启,或者广播join来优化性能
- 可以通过调整一些参数来控制map join的开启条件,如设置hive.auto.convert.join参数、hive.mapjoin.smalltable.filesize参数和hive.mapjoin.cache.numrows参数
场景5: join大表join大表
处理思路
- 可以通过行列裁剪和分区表谓词下推来缩小表的规模,从而优化性能
场景6: map数量太少
处理思路
- 可以通过控制每个map读取的大小来增加map的数量,从而提高并行度
- 可以设置一些参数来调整map的读取方式,如mapreduce.input.fileinputformat.split.maxsize和mapreduce.input.fileinputformat.split.minsize.per.node参数,mapred.max.split.size也可以
场景7: map上游小文件过多
处理思路
- 可以开启map小文件合并功能,将小文件合并成更大的文件
- 可以设置一些参数来优化合并策略,如hive.merge.size.per.task参数、hive.exec.orc.default.block.size参数和hive.exec.orc.default.stripe.size参数
场景8: mergefile之后小文件过多
处理思路
- 可以开启写stage的小文件合并功能,将合并之后的小文件再次合并成更大的文件
- 可以设置一些参数来优化合并策略,如hive.merge.smallfiles.avgsize参数、hive.merge.mapfiles参数和hive.merge.mapredfiles参数
场景9: hive数据倾斜专用的参数
处理思路
- 可以使用一些特定的参数来处理倾斜问题,如设置hive.optimize.skewjoin参数、hive.skewjoin.key参数和hive.optimize.skewjoin.compiletime参数
- 这些参数不推荐使用,因为如果配置不正确可能会导致性能变慢
场景10: reduce弱
处理思路
- 针对一些倾斜情况不严重的情况,可以通过调整reduce的内存和个数来提高并行度
- 可以设置一些参数来控制reduce的内存和个数,如hive.exec.reducers.bytes.per.reducer、hive.exec.reducers.max和mapreduce.job.reduces等
场景11: map弱
处理思路
- 可以通过调整map的内存和核心数来提高并行度和性能
- 可以设置一些参数来控制map的内存和核心数,如mapreduce.map.memory.mb、mapreduce.map.cpu.vcores和mapreduce.map.java.opts等
场景12: hive并行不够
处理思路
- 对于Hive作业,并行度不够的情况,可以通过调整一些参数来增加并行度
- 可以设置一些参数来调整并行度,如hive.exec.parallel、hive.exec.parallel.thread.number等
场景13: Spark作业专用
处理思路
- 针对Spark作业,并行度不够的情况,可以通过调整一些参数来增加并行度
- 可以设置一些参数来调整并行度,如spark.dynamicAllocation.enabled、spark.yarn.driver.memory、spark.executor.memory、spark.executor.instances和spark.executor.cores等