HIVE数据倾斜

数据倾斜的定义

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

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

在这里插入图片描述

数据倾斜的原因
  • 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 回去。
### 解决Hive数据倾斜问题的方法 #### 诊断数据倾斜问题 为了有效地解决Hive中的数据倾斜问题,首先要能够准确地识别和定位这些问题。通常可以通过以下几个方面来诊断: - **查看日志文件**:通过分析MapReduce任务的日志文件可以发现哪些reduce task运行时间过长,这可能是由于数据倾斜造成的[^1]。 - **统计key分布情况**:利用SQL语句获取各个key的数量,以此判断是否存在某些特定key对应的数据量异常庞大。例如: ```sql SELECT key, COUNT(*) as count FROM table GROUP BY key ORDER BY count DESC LIMIT 10; ``` - **监控资源消耗**:观察不同task使用的CPU、内存等资源比例,如果某几个task占用过多资源,则可能存在数据倾斜。 #### 优化措施 针对已确诊的数据倾斜问题,可以从多个角度采取相应的优化手段: - **调整Join策略** 对于涉及大表之间的join操作,尤其是当其中一个表存在大量重复键值时,可能会引发严重的数据倾斜。此时可考虑采用广播变量的方式将较小的一方全量加载至内存中参与计算;或者尝试使用`MAPJOIN`提示让Hive自动选择合适的连接方式[^4]。 - **预处理输入数据** 如果是因为特殊值(如NULL或其他非法字符)引起的倾斜,可以在执行主要查询之前先对原始数据集进行清洗,去除或转换掉那些可能导致问题的记录[^2]。 - **重分配数据流** 当遇到因hash冲突而导致的部分reducer负载过高时,可通过引入额外字段作为辅助分区依据,使得原本集中在少数几处的数据被均匀散布开来。具体做法是在原有基础上附加一个随机数列,再基于组合后的复合键来进行分组聚合运算。 - **应用DISTRIBUTE BY与SORT BY** 合理运用这两个子句可以帮助更好地控制shuffle过程中的数据流向,减少不必要的网络传输开销并提高整个流程效率。对于一些场景下还可以配合RAND()函数实现更加灵活的数据划分。 ```sql SELECT u.user_name, o.product FROM users u JOIN orders o ON u.user_id = o.user_id DISTRIBUTE BY RAND(); ``` 上述方法综合起来有助于缓解乃至彻底消除大多数情况下所面临的数据倾斜难题,进而达到提升查询性能的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值