Hive 数据倾斜

1.什么是数据倾斜

数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大 于平均时长。

根本原因就是大量相同的key被分配到一个reduce里,造成一个reduce任务累死了,但是其他的reduce任务闲死

2.产生的原因

1,key 分布不均匀。
2,业务数据本身的特性。
3,建表考虑不周全。

4,某些 hsql 语句本身就存在数据倾斜。

就像进行表关联时:

(1)大表join小表:其实小表的key集中,分发到某一个或者几个reduce上的数据远远高于平均值

(2)大表join大表:空值或无意义值:如果缺失的项很多,在做join时这些空值就会非常集中,拖累进度。

(3)group by: group by的时候维度过小,某值的数量过多,处理某值的reduce非常耗时间。

(4)Count distinct:某特殊值过多,处理此特殊值的reduce耗时。

3.具体的数据倾斜以及解决方法:

3.1 空值产生的数据倾斜

使本身为 null 的所有记录替代随机字符串或者先过滤掉空值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。

过滤掉空值的情况

select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
union all
select * from log c where c.user_id is null;

(2)赋予空值新的

### 解决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(); ``` 上述方法综合起来有助于缓解乃至彻底消除大多数情况下所面临的数据倾斜难题,进而达到提升查询性能的目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值