Spark 2:当SparkSession调用enableHiveSupport()时,它是如何工作的?

15

我的问题非常简单,但是我阅读文档后仍然找不到清晰的答案。

我在一个 CDH 5.10 集群上运行 Spark2。 还有 Hive 和 metastore。

我通过以下方式在我的 Spark 程序中创建了一个会话:

SparkSession spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()

假设我有以下的HiveQL查询:

spark.sql("SELECT someColumn FROM someTable")

我想知道:

  1. 这个查询是否在底层被翻译成了Hive MapReduce原语,还是
  2. HiveQL的支持仅限于语法层面,底层将使用Spark SQL。

我正在进行一些性能评估,不知道我是否应该声称使用 spark.sql([hiveQL query]) 执行的查询时间性能是指Spark还是Hive。

4个回答

23

Spark有两个目录,分别是hive和in-memory。如果您设置了enableHiveSupport(),那么spark.sql.catalogImplementation将被设置为hive,否则将被设置为in-memory。因此,如果启用了hive支持,则spark.catalog.listTables().show()会显示来自hive metastore的所有表。

但这并不意味着查询会使用hive,它只是表示Spark与hive-metastore通信,执行引擎始终是Spark。

*实际上,有些函数像percentilepercentile_approx是本地的hive UDAF。


在v2.4.2中,我使用了spark.catalog.listTables()而不是spark.catalog.listTables().show(),因为对于列表对象,show()不存在。 - dim_user
@SaulCruz 我的解决方案也适用于2.4.2版本。listTables() 返回一个数据集,其中包含 show 方法。 - Raphael Roth
有趣,我不确定缺少什么。 - dim_user
1
@SaulCruz 也许你没有使用Scala? - Raphael Roth
哈哈,@RaphaelRoth,就是这样,我以为这篇帖子是关于 PySpark 的,你发现了! - dim_user
这是否意味着查询是使用Spark SQL执行的? - Melissa Guo

13

设置enableHiveSupport并不意味着查询是在Hive中计算的。

它只涉及Hive目录。如果使用enableHiveSupport,则可以:

  • 读写来自Hive持久性元数据存储
  • 使用Hive的UDF
  • 使用Hive的SerDe

所有这些都与目录直接相关,而不是执行本身。

历史上,Hive QL解析也是使用Hive完成的,但现在Spark在不调用Hive的情况下完成了解析。

我应该声称使用spark.sql([hiveQL query])执行的查询的时间性能是指Spark还是Hive。

如上所述,这是Spark的性能。


0

有三个执行引擎,MapReduceTezSpark

当您使用hive执行查询时,可以选择使用上述任一引擎。通常情况下,管理员必须将其中一个引擎设置为默认引擎。

例如:

set hive.execution.engine=tez;

当您使用Spark执行查询时,它将使用Spark引擎来执行查询。

然而,如果您正在进行性能分析,时间不是您应该衡量的唯一因素,还应该测量内存和CPU。


我查了一下,它是MapReduce (mr)。这是否意味着Spark将HiveQL查询转发到Hive,然后由其将其转换为MR作业?所以我想我可以声称我的性能结果是指使用MR作为执行引擎的HiveQL吗? - Anthony Arrascue
Spark不会将任何查询转发到Hive,它使用自己的引擎Spark来执行查询。然而,你的Hive使用MR来执行查询。 - Gaurang Shah
1
这并没有回答问题。你提到的执行引擎是特定于Hive的。在Spark上运行的Hive与通过Spark执行Hive查询是不同的。 - philantrovert
@philantrovert,这就是我所说的,从Spark执行Hive查询将使用Spark执行引擎,而不会使用由Hive设置的引擎。 - Gaurang Shah

0

在底层,这个查询被转换成Hive MapReduce原语,或者说支持HiveQL只是在语法层面上,实际上底层会使用Spark SQL。

我在Hive metastore上使用Spark SQL。我验证查询是否被转换为Map/Reduce的方法是检查: a. 打开Hive控制台并运行一个带有一些过滤器的简单SELECT查询。现在进入YARN资源管理器。由于查询执行的结果,你会看到一些Map/reduce作业被触发。 b. 使用HiveContext运行Spark SQL并执行相同的SQL查询。Spark SQL将利用Hive的元数据信息而不触发Map/Reduce作业。进入YARN中的资源管理器并进行验证。你只会发现spark-shell会话正在运行,没有额外的Map/Reduce作业在集群上被触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接