hive中common join的执行过程

Posted

技术标签:

【中文标题】hive中common join的执行过程【英文标题】:the executing process of common join in hive 【发布时间】:2013-08-07 03:35:02 【问题描述】:

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

但是我被这个图弄糊涂了,只有reducer吗?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

set mapred.reduce.tasks=50

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

希望对您有所帮助。

【讨论】:

以上是关于hive中common join的执行过程的主要内容,如果未能解决你的问题,请参考以下文章

Hive查看执行日志

Hive学习之路 (二十)Hive 执行过程实例分析

hive sql的执行及编译过程

Hive SQL底层执行过程详细剖析

Hive3.1.2的HQL执行过程

Hive3.1.2的HQL执行过程