数据倾斜的定义

由于各种原因造成数据分布不均匀,造成数据大量集中在一点,造成数据热点。

数据倾斜产生的现象

  • 执行任务的时候,任务进度卡在99%,打开监控查看,只有一个或N个reduce任务处于运行未完成的状态。 这是因为处理的数据数量相比较其他reduce节点数据要大
  • 单一reduce处理数据量比平均reduce处理的数据量要大,通常是3倍甚至更多。处理时间也大于平均时长。

数据倾斜的情况

HIVE数据倾斜

数据倾斜的原因

  • Key 分布不均匀
  • 业务本身对某些维度需求较集中
  • 建表的时候未考虑周到
  • 某些SQL语句执行的时候,底层结构会造成数据倾斜

数据倾斜的解决方案

MAP端聚合

–Map端部分聚合,相当于Combine
hive.map.aggr= true;

–有数据倾斜的时候进行负载均衡
hive.groupby.skewindate=true;

解释 :默认为true的时候,查询计划会有两个MR,第一个MR执行的时候,Map操作会将结果数据随机分到Reduce中,每个Reduce做部分聚合操作,并输出结果
**作用:**可以将相同的key值放在不同的reduce端处理
第二个MR job的作用是,是将第一个 MR job散落在不同的reduce端的数据聚合起来。完成最后的聚合操作。

关于数据负载均衡方面的调优操作

如何进行 JOIN

关于驱动表的选取,使用key值分布平均的表作为基准表,在进行JOIN操作的时候,可以做基准表进行列裁剪和filter 操作,达到基准表数据量变少的效果。

JOIN的情况:

  • 大小表相互JOIN, 使用 map join 使得小表先进内存。
  • 大表JOIN大表,将key为null值的数据变成一个字符串+随机数,反正null值也关联不上null值,处理后并不影响最终结果。
  • count distinct 大量相同特殊值
    可以事先将空值过滤掉,等到最终结果+1处理
  • group by 维度过小
    维度过小导致产出数据 <data,count()> 值过多,可以使用 group by + sum的方式
    替换 count (distinct )操作。
  • 特殊情况特殊处理
    在不更改逻辑的前提下,将造成倾斜的数据单独拿出来做处理,最后在 union 回去。

相关文章: