【问题标题】:How to "force" Hive on Spark to use Map Join?如何“强制”Spark 上的 Hive 使用 Map Join?
【发布时间】:2019-08-13 11:12:24
【问题描述】:

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 无关)

谢谢

【问题讨论】:

  • 您能否准确显示您设置的 HoS 配置,并粘贴 EXPLAIN 以供查询?

标签: apache-spark hadoop hive


【解决方案1】:

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

...hive.auto.convert.join.noconditionaltask.size,也就是阈值 用于根据统计信息将公共连接转换为映射连接,可以有一个 显着的性能影响。 虽然使用了这个配置 对于 MapReduce 上的 Hive 和 Spark 上的 Hive,它被解释为 因人而异。

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

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

MapReduce 上的 Hive 使用 totalSize。当两者都可用时,Hive on Spark 使用rawDataSize。由于压缩和序列化,一个 totalSizerawDataSize 之间可能存在很大差异 相同的数据集。对于 Spark 上的 Hive,您可能需要指定更大的 hive.auto.convert.join.noconditionaltask.size 的值来转换 同一个连接到一个地图连接。

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

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

【讨论】:

  • 感谢您的回答。我知道这个设置。我认为问题是不同的,它涉及让 Spark 的优化器实现它可以使用基础表中的分区。当从字面上将视图执行的选择命令注入到查询中时,Spark 将使用 map-join。
  • 我们可能需要 MCVE 来更好地了解您的问题,然后 stackoverflow.com/help/minimal-reproducible-example
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2016-12-13
  • 2011-06-17
相关资源
最近更新 更多