Hive中的数据倾斜问题

1.数据倾斜是什么?

由于数据分布不均匀,造成数据大量集中到一台或者多台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

产生数据倾斜,有什么表现?

  1. 在使用Hive算数据的时候,reduce阶段卡在99.99%,不能结束。

  2. 查看日志或者监控界面,会发现:

    有一个或多个reduce卡住
    各种container报错OOM
    读写的数据量极大,至少远远超过其他正常的reduce
    伴随着数据倾斜,会出现任务被kill等各种诡异的表现
    

2.数据倾斜的原因?

  1. key分布不均匀
  2. 业务数据本身的特性
  3. 建表时考虑不周
  4. 某些SQL语句就有数据倾斜

数据倾斜的原理

  1. 数据倾斜产生的原因
    我们在做数据运算的时候,count、distinct、group by、join等操作,这些操作都会触发shuffle动作,一旦触发,所有相同的key的值就会拉到一个或者几个节点上,就容易发生单点问题。

  2. 万恶的shuffle
    如下图所示,因为数据分布不均匀,导致大量的数据分配到一个节点。
    在这里插入图片描述

  3. 从业务角度去理解数据倾斜
    数据与业务紧密相关,业务的场景直接影响到了数据的分布。再举一个例子,比如就说订单场景吧,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。

3.如何解决数据倾斜问题?

3.1参数调节

  • hive.map.aggr=true
    Map 端部分聚合,相当于Combiner(在reduce前,进行一次规约,减少在网络中传输速度)

  • hive.groupby.skewindata=true
    有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;
    第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

3.2SQL语句调节

  • 如何Join:
  • group by维度过小:
  • 特殊情况特殊处理:

3.3业务逻辑

  1. 有损方法:
    将找到异常数据,比如ip为0的数据,过滤掉

  2. 无损方法:
    将(分布不均匀的数据单独计算)北京、上海两地数据单独处理,然后再将处理后的结果汇总到一起。
    先对key做一层hash,先将数据打散让它并行度变大,再汇集。

  3. 数据预处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值