数据倾斜主要有以下6种情况:
1:空值引起的数据倾斜
2:数据类型不同引起的数据倾斜
3:不可拆分大文件引起的
4:数据膨胀引起的
5:表连接
6:确实无法减少数据量引起的
1:空值引起的数据倾斜
- 禁止null参加join操作,不让其参与shuffle
- null随机转化成其他值
2:数据类型不同引起的数据倾斜
类型统一转化成string 或者其他
3:不可拆分大文件引起的
调整参数:采用bzip/zip等支持大文件切割的技术,避免文件在一个map任务中
4:数据膨胀引起的
数据膨胀是指任务的输出条数/数据量级比输入条数/数据量级大很多
- 调整sql逻辑语句
- 调整参数:hive.job.grouping.set.cardinality 默认值为30,自动控制作业拆解
5:表连接
map端优化,将倾斜的数据转到分布式缓存中,分发到各个Map任务所在节点。在Map阶段完成join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜
MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能在一定程度上节省资源提高JOIN效率
6:确实无法减少数据量引起的
reduce端优化,调整reduce运行的内存大小
调整reduce的内存大小使用mapreduce.reduce.memory.mb这个配置