首页 > 解决方案 > 如何“强制”Spark 上的 Hive 使用 Map Join?

问题描述

Spark 上的 Hive 不使用 Map-Join 来查询对多个表执行联合的视图。

当使用 MR 引擎进行相同的查询时,使用 Map-Join。

我尝试按照 Cloudera 的建议设置各种火花设置 - https://www.cloudera.com/documentation/enterprise/5-13-x/topics/admin_hos_oview.html#dpp_in_hos

我正在使用的视图是一个简单的联合,遍布一些具有相同结构并已分区的表。

视图是这样创建的:

create view myView
as
select * from tbl1
union all
select * from tbl2
union all
select * from tbl3
union all
select * from tbl4

我正在运行的 HQL 查询有一个“ where子句”,其中需要进行分区访问。HoS 没有意识到这一点,而 HoMR 利用了分区和 Map-Join。

当前使用 Hive 1.1(建议升级与 atm 无关)

谢谢

标签: apache-sparkhadoophive

解决方案


本 Cloudera 文档MapJoin中所述,以下设置对Hive On Spark中的行为有直接影响:

... hive.auto.convert.join.noconditionaltask.size,这是将 common join 转换为基于统计的 map join 的阈值,可能会对性能产生重大影响。尽管此配置用于 MapReduce 上的 Hive 和 Spark 上的 Hive,但它们的解释不同。

数据的大小由两个统计数据描述:

  • totalSize- 磁盘上数据的近似大小
  • rawDataSize- 内存中数据的近似大小

MapReduce 上的 Hive 使用totalSize. 当两者都可用时,Hive on Spark 使用rawDataSize. 由于压缩和序列化,同一数据集之间可能会出现totalSize很大差异。rawDataSize对于 Spark 上的 Hive,您可能需要为 指定更大的值hive.auto.convert.join.noconditionaltask.size才能将相同的连接转换为映射连接。

请查看这是否适用于您的情况。

由于我们没有看到您的查询,我不确定动态分区修剪(在您的链接中引用)与您的MapJoin问题有何关系。


推荐阅读