蜂巢中常见连接的执行过程

时间:2013-08-07 03:35:03

标签: join mapreduce hive

假设在A.a=B.a上加入B,并且它们都是大表。 Hive将通过公共连接处理此连接操作。执行图(由facebook给出): enter image description here

但我对此图表感到困惑,是否只有减速机?

据我了解,地图输出键为table_name_tag_prefix+join_key。但是在分区阶段,它仍然使用join_key来分区记录。在reduce阶段,每个reducer读取具有相同连接键的<join_key,value>,reducer不需要读取所有地图分割。

2 个答案:

答案 0 :(得分:2)

减速器的数量由hive.exec.reducers.bytes.per.reducer定义(默认为1GB) 因此,对于映射器的每GB输入数据,您将获得1个减速器 然后,hive在连接列上使用hash()函数,并对散列函数的输出进行模运算,并使用首先设置的reducer数。

因此,如果您加载10 GB的数据(两个表一起),应该有~10个减少器 不能说我们按列ID加入,所以让我们假设下一个输出:
hash(101)=101 -> 101%10=1
hash(102)=102 -> 102%10=2
hash(1001)=1001 -> 1001%10=1

因此,ID列中值为101和1001的行将转到reducer#1,而ID 102将转到reducer#2。你仍然会有10个减速器但如果所有数据只有上面的ID那么8个减速器将没有输入,2个减速器将得到其余的。

答案 1 :(得分:1)

理论上,有两种情况只有一种或有多种减速剂。使用的减速器的确切数量取决于查询详细信息。

您可以尝试使用脚本中的以下内容设置要使用的缩减器数量。

set mapred.reduce.tasks=50

这是否实际导致性能提升取决于您正在执行的查询。有关更多详细信息,另请参阅this answer

希望有所帮助。