Join 配置单元中公共联接的执行过程

Join 配置单元中公共联接的执行过程,join,mapreduce,hive,Join,Mapreduce,Hive,假设A.A=B.A上有一个join B,它们都是大表。配置单元将通过公共联接处理此联接操作。执行图(由facebook提供): 但我被这张图弄糊涂了,是不是只有减速器 据我所知,映射输出键是表\u名称\u标记\u前缀+连接\u键。但在分区阶段,它仍然使用join_键对记录进行分区。在reduce阶段,每个reducer读取具有相同连接键的,reducer不需要读取所有映射拆分。理论上,两种情况下都有一个或多个reducer。使用的减缩器的确切数量将取决于查询详细信息 您可以尝试在脚本中使用以下

假设A.A=B.A上有一个join B,它们都是大表。配置单元将通过公共联接处理此联接操作。执行图(由facebook提供):

但我被这张图弄糊涂了,是不是只有减速器


据我所知,映射输出键是
表\u名称\u标记\u前缀+连接\u键
。但在分区阶段,它仍然使用join_键对记录进行分区。在reduce阶段,每个reducer读取具有相同连接键的
,reducer不需要读取所有映射拆分。

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

您可以尝试在脚本中使用以下命令设置要使用的还原器的数量

set mapred.reduce.tasks=50
这是否真的会导致性能的提高取决于您正在执行的查询。有关更多详细信息,请参见


希望能有所帮助。

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

因此,如果加载10GB的数据(两个表一起),则应该有~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个减缩器将得到其余的