Hive数据倾斜JOIN操作,如何避免性能灾难?
- 内容介绍
- 文章标签
- 相关推荐
Hive数据倾斜JOIN操作,如何避免性能灾难?
记得是7月初某个早上,我接到了一个紧急任务:处理两张大型数据表的关联查询。数据量看起来并不算特别大,左表约8000万行,右表约1.2亿行。我按照常规思路编写了JOIN查询:,内卷。
SELECT _id, _count, _count, _active_dateFROM us 梳理梳理。 er_order_summary aJOIN user_behavior_summary b ON _id = _id;

本以为这个查询会在30分钟内完成,但实际运行了2个小时后仍然没有结束。通过YARN的资源管理器, 我发现有一个Reduce任务施行时间异常长,而其他Reduce任务早已完成。
问题根源在于数据质量问题:
这玩意儿... 查询后来啊令人震惊:右表中存在大量user_id为0和-1的异常数据, 其中user_id=0的记录高达3000万条,user_id=-1的记录有1500万条。这就是导致数据倾斜的元凶!
补救一下。 可以看到Reducer 7处理了5200万条记录,而其他Reducer大多只处理100-200万条记录。
Hadoop job information for Stage-1: number of mappers: 200; number of reducers: 100...Reducer 5: Processed 45000000 recordsReducer 6: Processed 48000000 recordsReducer 7: Processed 52000000 records -- 异常多的数据量Reducer 8: Processed 1200000 records...
检查JOIN键的数据分布:
多损啊! 怀疑是数据倾斜问题, 于是检查JOIN键的数据分布:
-- 检查左表user_id分布SELECT user_id, COUNT as freqFROM user_order_summaryGROUP BY user_idORDER BY freq DESCLIMIT 20;-- 开倒车。 检查右表user_id分布 SELECT user_id, COUNT as freqFROM user_behavior_summaryGROUP BY user_idORDER BY freq DESCLIMIT 20;
我是深有体会。 理解Hive特性:Hive在处理JOIN、GROUP BY等操作时,NULL值会被视为相同的键,这个特性在数据倾斜时需要特别注意.
解决方案:
最简单的解决方案是过滤掉无效值:
优化JOIN操作:
启用Hive的数据倾斜优化:
纯属忽悠。 -- 增加Reducer数量 SET =200; -- 启用并行施行 SET =true; SET =16; -- 优化JOIN操作 SET =true; SET =10000000;
将小表加载到内存中,避免Shuffle过程:
不靠谱。 SET =true;SET =25000000;SELECT /*+ MAPJOIN */ _id, _count, _count, _active_dateFROM user_order_summary aJOIN ) b ON _id = _id;
Hive 数据倾斜常见解决方案对比:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 过滤无效值 | 简单直接 | 可能丢失部分数据 |
| MapJoin | 避免Shuffle,提高性能 | 需要小表能加载到内存中 |
| 增加Reducer数量 | 提高并行度,缓解倾斜 | 可能增加资源消耗和作业复杂度 |
| Hive数据倾斜优化参数设置 | 自动优化,无需 SQL | 需要 |
:
这次事故让我深刻认识到,大数据开发不仅仅是写SQL那么简单,更需要关注数据本身的质量特征。 我深信... 一个看似简单的JOIN操作,背后可能隐藏着严重的数据倾斜问题。
通过这些措施, 我们成功将类似问题的发生率降低了90%以上, 来一波... 大大提高了数据处理的效率和稳定性。
hive 调优_hivesql join 后group by...一般情况下 ,hive 在做 join 的时候 ,会打印 join 的日志 .该key为导致 join 倾斜的key。.
-- 创建分桶表CREATE TABLE user_behavior_summary_bucketed CLUSTERED BY INTO 100 BUCKETSSTORED AS ORC;-- 导入数据时先过滤无效值INSERT OVERWRITE TABLE user_behavior_summary_bucketedSELECT user_id, login_count, last_active_dateFROM user_behavior_summaryWHERE user_id NOT IN ;-- 使用分桶表进行JOINSELECT _id, _count, _count, _active_dateFROM user_order_summary aJOIN user_behavior_summary_bucketed b ON _id = _id;,我晕...
set hive .groupby.skewindata=true ; 这是通用的算法优化 , 但算法优化有时不能适应特定业务背景 , 开发人员了解业务 , 了解 数据 , 可以通过业务逻辑精确有效的解决 数据 倾斜问题。. 在编写带有 join 操作的代码语句时 ,应该将条目少的表 / 子查询放在 Join 操作 符的左边 . hive 性能优化时 ,把 HiveQL 当做 M/R 程序来读 ,即从 M/R 的运行角度来考虑优化 性能 , 从更底层思考如何优化运算 性能 , 而不仅仅局...,一句话概括...
Hive数据倾斜JOIN操作,如何避免性能灾难?
记得是7月初某个早上,我接到了一个紧急任务:处理两张大型数据表的关联查询。数据量看起来并不算特别大,左表约8000万行,右表约1.2亿行。我按照常规思路编写了JOIN查询:,内卷。
SELECT _id, _count, _count, _active_dateFROM us 梳理梳理。 er_order_summary aJOIN user_behavior_summary b ON _id = _id;

本以为这个查询会在30分钟内完成,但实际运行了2个小时后仍然没有结束。通过YARN的资源管理器, 我发现有一个Reduce任务施行时间异常长,而其他Reduce任务早已完成。
问题根源在于数据质量问题:
这玩意儿... 查询后来啊令人震惊:右表中存在大量user_id为0和-1的异常数据, 其中user_id=0的记录高达3000万条,user_id=-1的记录有1500万条。这就是导致数据倾斜的元凶!
补救一下。 可以看到Reducer 7处理了5200万条记录,而其他Reducer大多只处理100-200万条记录。
Hadoop job information for Stage-1: number of mappers: 200; number of reducers: 100...Reducer 5: Processed 45000000 recordsReducer 6: Processed 48000000 recordsReducer 7: Processed 52000000 records -- 异常多的数据量Reducer 8: Processed 1200000 records...
检查JOIN键的数据分布:
多损啊! 怀疑是数据倾斜问题, 于是检查JOIN键的数据分布:
-- 检查左表user_id分布SELECT user_id, COUNT as freqFROM user_order_summaryGROUP BY user_idORDER BY freq DESCLIMIT 20;-- 开倒车。 检查右表user_id分布 SELECT user_id, COUNT as freqFROM user_behavior_summaryGROUP BY user_idORDER BY freq DESCLIMIT 20;
我是深有体会。 理解Hive特性:Hive在处理JOIN、GROUP BY等操作时,NULL值会被视为相同的键,这个特性在数据倾斜时需要特别注意.
解决方案:
最简单的解决方案是过滤掉无效值:
优化JOIN操作:
启用Hive的数据倾斜优化:
纯属忽悠。 -- 增加Reducer数量 SET =200; -- 启用并行施行 SET =true; SET =16; -- 优化JOIN操作 SET =true; SET =10000000;
将小表加载到内存中,避免Shuffle过程:
不靠谱。 SET =true;SET =25000000;SELECT /*+ MAPJOIN */ _id, _count, _count, _active_dateFROM user_order_summary aJOIN ) b ON _id = _id;
Hive 数据倾斜常见解决方案对比:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 过滤无效值 | 简单直接 | 可能丢失部分数据 |
| MapJoin | 避免Shuffle,提高性能 | 需要小表能加载到内存中 |
| 增加Reducer数量 | 提高并行度,缓解倾斜 | 可能增加资源消耗和作业复杂度 |
| Hive数据倾斜优化参数设置 | 自动优化,无需 SQL | 需要 |
:
这次事故让我深刻认识到,大数据开发不仅仅是写SQL那么简单,更需要关注数据本身的质量特征。 我深信... 一个看似简单的JOIN操作,背后可能隐藏着严重的数据倾斜问题。
通过这些措施, 我们成功将类似问题的发生率降低了90%以上, 来一波... 大大提高了数据处理的效率和稳定性。
hive 调优_hivesql join 后group by...一般情况下 ,hive 在做 join 的时候 ,会打印 join 的日志 .该key为导致 join 倾斜的key。.
-- 创建分桶表CREATE TABLE user_behavior_summary_bucketed CLUSTERED BY INTO 100 BUCKETSSTORED AS ORC;-- 导入数据时先过滤无效值INSERT OVERWRITE TABLE user_behavior_summary_bucketedSELECT user_id, login_count, last_active_dateFROM user_behavior_summaryWHERE user_id NOT IN ;-- 使用分桶表进行JOINSELECT _id, _count, _count, _active_dateFROM user_order_summary aJOIN user_behavior_summary_bucketed b ON _id = _id;,我晕...
set hive .groupby.skewindata=true ; 这是通用的算法优化 , 但算法优化有时不能适应特定业务背景 , 开发人员了解业务 , 了解 数据 , 可以通过业务逻辑精确有效的解决 数据 倾斜问题。. 在编写带有 join 操作的代码语句时 ,应该将条目少的表 / 子查询放在 Join 操作 符的左边 . hive 性能优化时 ,把 HiveQL 当做 M/R 程序来读 ,即从 M/R 的运行角度来考虑优化 性能 , 从更底层思考如何优化运算 性能 , 而不仅仅局...,一句话概括...

