Spark 2:调用SparkSession enableHiveSupport()时如何工作

Ant*_*cue 4 hive hiveql apache-spark apache-spark-sql

我的问题很简单,但是以某种方式我无法通过阅读文档找到明确的答案。

我在CDH 5.10群集上运行了Spark2。还有Hive和Metastore。

我在Spark程序中创建一个会话,如下所示:

SparkSession spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
Run Code Online (Sandbox Code Playgroud)

假设我有以下HiveQL查询:

spark.sql("SELECT someColumn FROM someTable")
Run Code Online (Sandbox Code Playgroud)

我想知道是否:

  1. 在后台将这个查询翻译为Hive MapReduce原语,或者
  2. 对HiveQL的支持仅在语法上,Spark SQL将在后台使用。

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

T. *_*ęda 9

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

这仅与 Hive 目录有关。如果您使用enableHiveSupport,那么您可以:

  • 向/从 Hive 持久元存储写入和读取
  • 使用 Hive 的 UDF
  • 使用 Hive 的 SerDe

所有这些都直接与 Catalog 相关联,而不是执行本身

从历史上看,Hive QL 解析也是使用 Hive 完成的,但现在 Spark 无需调用 Hive 即可完成

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

如上所述,它是 Spark 的性能


Rap*_*oth 6

Spark知道两个目录,hive和内存。如果设置enableHiveSupport(),则spark.sql.catalogImplementation设置为hive,否则设置为in-memory。因此,如果启用hive支持,spark.catalog.listTables().show()将向您显示hive metastore中的所有表。

但这并不意味着将hive用于查询*,仅意味着spark与hive-metastore通信,执行引擎始终是spark。

*实际上有一些像percentileund的功能percentile_approx是本地蜂巢UDAF。


Gau*_*hah 0

共有三个执行引擎:MapReduceTezSpark

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

IE

set hive.execution.engine=tez;
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您正在进行性能分析,时间并不是您应该测量的唯一内容,还应该测量内存和 CPU。