看文档的时候突然发现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啦。
4864

被折叠的 条评论
为什么被折叠?



