3

假设 A join B on A.a=B.a,并且它们都是大表。Hive 会通过 common join 来处理这个 join 操作。执行图(由 facebook 提供): 在此处输入图像描述

但是我对这张图感到困惑,只有减速机吗?

据我了解,地图输出键是table_name_tag_prefix+join_key. 但是在分区阶段,它仍然使用 join_key 对记录进行分区。在reduce阶段,每个reducer读取<join_key,value>具有相同join key的,reducer不需要读取所有的map split。

4

2 回答 2

2

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

因此,如果您加载 10 GB 的数据(两个表一起),则应该有大约 10 个 reducer。
不可以说我们按列加入,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 个 reducer,但如果所有数据都只有上述 ID,那么 8 个 reducer 将没有输入,2 个 reducer 将得到其余的。

于 2013-08-07T17:07:03.897 回答
1

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

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

set mapred.reduce.tasks=50

这是否真的会导致任何性能提升取决于您正在执行的查询。有关更多详细信息,另请参阅此答案

希望有帮助。

于 2013-08-07T06:09:33.927 回答