Hive中的Skew Join

hive 专栏收录该内容
9 篇文章 0 订阅

看文档的时候突然发现Skew Join,之前只知道有内外连接,半开连接,全外连接,笛卡尔积,于是赶紧学习了下Skew Join,在这里做个总结。

首先简单介绍下什么是数据倾斜

比如我们有10000条数据,有10个reducer来处理数据,在这10000条数据中有9000条的key是相同的,这样经过hash之后,就会出现有一个reducer要自己处理9000条数据,而剩下的9个reducer可能每个只处理100多条数据,当这9个reducer早早跑完之后,第一个reducer可能只完成了百分之几,这9个reducer就要静静等待…直到第一个完成,具体的表现就是任务一直卡在98% 99%,大大减慢了数据的处理速度。

Skew Join 是如何处理数据倾斜的

当我们开启Skew Join之后:

set hive.optimize.skewjoin = true;

在运行时,会对数据进行扫描并检测哪个key会出现倾斜,对于会倾斜的key,用map join做处理,不倾斜的key正常处理。

举个栗子

表 A 和表 B join,并且在 ID 为12345 时发生了数据倾斜,假设在表 B 中倾斜的数据量比表 A 少,则把 B 中所有的倾斜了的数据拿出来,存到内存中(可以用一个哈希表来存)。
对于表 A ,如果是倾斜的数据,则通过 B 存放在内存中的哈希表来 join;如果不是倾斜的 key,则按正常的 reduce 端 join 流程进行。
这样就在map端完成了倾斜数据的处理,不会让某一个reducer中数据量爆炸,从而拖累处理速度。

要查看语句是否用到了 Skew Join,可以 explain 一下你的 SQL,如果在 Join Operator 和 Reduce Operator Tree 下的 handleSkewJoin 为 true,那就是用了Skew Join啦。

  • 1
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值