Hive Map-Join配置之谜

Hive Map-Join configuration mystery

有人可以清楚地解释一下

之间的区别吗
hive.auto.convert.join

hive.auto.convert.join.noconditionaltask

配置参数?

还有这些相应的尺寸参数:

hive.mapjoin.smalltable.filesize

hive.auto.convert.join.noconditionaltask.size

我的观察是,当 运行 在 Tez 上时,Map-Join 在 hive.auto.convert.join.noconditionaltask.size 设置为足够高的值时起作用,即使 hive.mapjoin.smalltable.filesize 设置小于小 table.

为什么我们需要两者

hive.auto.convert.joinhive.auto.convert.join.noconditionaltask?

Apache documentation 非常混乱。

这些参数用于决定何时在 hive 中使用 Map Join 而不是 Common join,这最终会影响最终的查询性能。

Map join 在其中一个 join table 小到足以装进内存时使用,因此速度非常快。这里是所有参数的解释:

hive.auto.convert.join

当此参数设置为true时,Hive会自动检查较小的table文件大小是否大于hive.mapjoin.smalltable.filesize指定的值,如果大于此值则查询通过普通连接执行。启用自动转换连接后,无需在查询中提供映射连接提示。

hive.auto.convert.join.noconditionaltask

当三个或更多table参与join,并且

hive.auto.convert.join = true - Hive 生成​​三个或更多 map-side 连接,假设所有 table 的大小都较小。

hive.auto.convert.join.noconditionaltask = true,如果 n-1 table 的大小小于 10 MB,则 Hive 会将三个或更多 map-side join 合并为一个 map-side join。这里的大小由 hive.auto.convert.join.noconditionaltask.size.

定义

hive.mapjoin.smalltable.filesize

此设置基本上是告诉优化器系统中小 table 定义的方式。此值定义什么是小的 table,然后当基于此值执行查询时,它确定连接是否有资格转换为 map join

hive.auto.convert.join.noconditionaltask.size

大小配置使用户能够控制table内存中可以容纳的大小。该值表示可以转换为适合内存的散列映射的 tables 的大小总和。

这是非常好的解释 link,其中包括对所有 4 个参数的描述和示例:

http://www.openkb.info/2016/01/difference-between-hivemapjoinsmalltabl.html