hive 模拟定位数据倾斜到具体sql

用户信息表

select * from b;
+-------+---------+--+
| b.id  | b.name  |
+-------+---------+--+
| 1     | 张三      |
| 2     | 李四      |
| 3     | 赵六      |
+-------+---------+--+

用户爱好记录表

select * from c;
+-------+----------+--+
| c.id  | c.aihao  |
+-------+----------+--+
| 1     | 打球       |
| 1     | 唱歌       |
| 1     | 看书       |
| 2     | 看书       |
| 2     | 打球       |
| 2     | 跳舞       |
| 2     | 飙车       |
| 2     | 打游戏      |
| 3     | 看书       |
+-------+----------+--+

计算每个同学的name,以及有几个爱好

sql

select
b.name,
tmp.cts
from
(select id,sum(1) as cts from c group by id) tmp
join b
on tmp.id=b.id
;
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1  Reduce: 2   Cumulative CPU: 5.4 sec   HDFS Read: 11670 HDFS Write: 249 SUCCESS
Stage-Stage-2: Map: 1  Reduce: 2   Cumulative CPU: 4.89 sec   HDFS Read: 7419 HDFS Write: 249 SUCCESS
Stage-Stage-7: Map: 1   Cumulative CPU: 1.65 sec   HDFS Read: 5718 HDFS Write: 168 SUCCESS
Total MapReduce CPU Time Spent: 11 seconds 940 msec
OK
+---------+----------+--+
| b.name  | tmp.cts  |
+---------+----------+--+
| 李四      | 5        |
| 张三      | 3        |
| 赵六      | 1        |
+---------+----------+--+
3 rows selected (79.642 seconds)

正常情况产生了3个job

在这里插入图片描述

不正常情况如果某个job卡住了比如application_1628137675824_0060这个任务显示reduce长时间卡在98%或者99%

Starting Job = job_1628137675824_0060, Tracking URL = http://wxt01:8088/proxy/application_1628137675824_0059/
Kill Command = /usr/app/hadoop-2.8.5//bin/hadoop job  -kill job_1628137675824_0060
Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 2
2021-08-05 19:20:56,449 Stage-2 map = 0%,  reduce = 0%
2021-08-05 19:21:01,601 Stage-2 map = 100%,  reduce = 0%, Cumulative CPU 1.91 sec
2021-08-05 19:21:06,753 Stage-2 map = 100%,  reduce = 50%, Cumulative CPU 3.68 sec
2021-08-05 19:21:09,904 Stage-2 map = 100%,  reduce = 99%, Cumulative CPU 3.68 sec
2021-08-05 19:22:09,904 Stage-2 map = 100%,  reduce = 99%, Cumulative CPU 3.68 sec
2021-08-05 19:23:09,904 Stage-2 map = 100%,  reduce = 99%, Cumulative CPU 3.68 sec
2021-08-05 19:24:09,904 Stage-2 map = 100%,  reduce = 99%, Cumulative CPU 3.68 sec
2021-08-05 19:25:09,904 Stage-2 map = 100%,  reduce = 99%, Cumulative CPU 3.68 sec

排查是不是数据倾斜,在yarn上找到这个job_1628137675824_0060,上面显示是stage-2阶段,我们点进去看reduce,如果每个reduce task运行时间都差不多,可能是reduce个数分配的少了,也有可能是这个节点本身的原因,我们有开启那个推测执行,如果推测执行启动的任务也还是慢,就说明是发生了数据倾斜.

我们在yarn外部界面中找到job_1628137675824_0060这个任务,点进去查看reduce tasks的counters

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6vjHDa7-1628168153233)(C:\Users\wxt\AppData\Roaming\Typora\typora-user-images\1628164379008.png)]

比如其它运行完的reduce task 这个读取的条数为差不多都在20000000条左右,

然后这个卡住的这个reduce task读取的数据条数为2个亿左右,明显比其他reduce中的数据多了10倍.

所以是发生了数据倾斜.就是在job_1628137675824_0060这个任务,stage-2阶段

然后去查看sql的执行计划

explain
select
b.name,
tmp.cts
from
(select id,sum(1) as cts from c group by id) tmp
join b
on tmp.id=b.id
;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mqduaoK8-1628168153234)(C:\Users\wxt\AppData\Roaming\Typora\typora-user-images\1628167261755.png)]

说明是group by阶段sum时发生了数据倾斜

在这里插入图片描述

表c中有倾斜的key

然后查看这个表里c表中的数据

select
id,
count(1) as cts
from c
group by id
order by cts desc limit 100;

然后针对情况进行具体解决

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Hive中,数据倾斜是一个常见的问题,尤其是在一些聚合操作(如GROUP BY、JOIN等)中,某些key的数据量极大,而其他key的数据量很小,导致某些任务处理的数据量远远大于其他任务,从而导致任务执行时间过长,甚至执行失败。这种情况下,我们可以采取以下几种方法来解决数据倾斜问题。 1. 使用随机数函数和分桶技术 可以使用Hive中的rand()函数生成一个0~1之间的随机数,并将其与桶的数量相乘,然后向下取整得到桶的编号,将原始数据按照随机分配到若干个桶中。然后对每个桶内的数据进行单独的统计,并将各个桶内的统计结果合并起来,得到总体的统计结果。这样可以将原始数据分散到各个桶中,从而避免了数据倾斜的问题。 2. 使用Map-side Aggregation Map-side Aggregation是一种在Map端对数据进行聚合的技术,可以避免Reduce端的数据倾斜问题。在使用Map-side Aggregation时,需要将数据按照聚合key进行分组,并在Map端对每个组内的数据进行聚合操作,然后将聚合结果输出到HDFS上的中间文件中。最后,在Reduce端对中间文件进行合并操作,得到最终的聚合结果。 3. 使用Combiner Combiner是一种在Map端对数据进行局部聚合的技术,可以减少Reduce端的数据量,从而避免数据倾斜问题。在使用Combiner时,需要将数据按照聚合key进行分组,并在Map端对每个组内的数据进行局部聚合操作,然后将聚合结果输出到Reduce端进行合并操作。这样可以将Reduce端需要处理的数据量减少到最小。 4. 使用Bucketing Bucketing是一种将数据按照特定的key分散到若干个桶中的技术,可以避免数据倾斜问题。在使用Bucketing时,需要在创建表时指定bucket数和bucket列,然后将数据按照bucket列进行分桶操作。这样可以将数据分散到若干个桶中,并且每个桶中的数据量相对均衡。 综上所述,以上几种方法都可以有效地解决Hive中的数据倾斜问题,具体采用哪种方法需要根据具体的情况进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值