数据倾斜会在数据量级较大的表中,查询的时候时常遇到,如何理解数据倾斜?大数据的处理目前大多都依赖分布式计算,在并行处理的过程中数据在不同的节点中分布不均,导致数据大量集中在某一个节点,查询时被卡住的现象;在hivesql中的distinct、group by 、join 时出现的频率较高;
首先我们剖析一下导致倾斜的原因:
1)、某个数据源表本身存在倾斜,节点数据分布不均,导致任务长时间挂起,导致资源利用率下降;在嵌套查询中,任务1需要依赖在任务0计算结果的情况下,这时任务0由于数据倾斜,导致宕机(任务执行时间过长或者直接挂起),那么这个整个作业都会被挂起;
2)、在shuffle阶段造成倾斜,比如特定key值数量过多,导致join发生时,大量数据涌向一个节点,导致数据严重倾斜,个别节点的读写压力是其他节点的好几倍,引发OOM错误内存溢出,导致任务失败;
3)、数据写入时,出现的数据分布不均;
4)、数据清洗过程中,过滤大量的数据导致节点分布不均;
常见的处理方式有以下几种:
1)、用group by 替换distinct,原理是将数据先分组,再处理;
2)、两表数据量级差距大时,用map join ,原理是行列缩减,省去shuffle的过程(使用DistributedCache机制将小表存储到各个Mapper进程所在机器的磁盘空间上,各个Mapper进程读取不同的大表分片,将分片中的每一条记录与小表中所有记录进行合并,合并后直接输出map结果即可得到最终结果);
3)、group by时把数据量大的分组单独计算,再union all合并到一起;
4)、特殊的key处理,join前优化;
5)、在对大表数据进行过滤后,做一次repartition,让数据重回均匀分布的状态,避免后续查询时发生倾斜;
6)、保证数据源质量,尽量不要用coalesce,而是用repartition,这样写出的数据,各文件大小往往是均衡的;
本文是个人的学习笔记,记录了产生数据倾斜的原因及一些常用的解决方案,欢迎大家补充,一起探讨,如果遇到类似问题,可以快速破解