Apache Spark:我如何理解和控制我的查询是在 Hive 引擎还是 Spark 引擎上执行的?

Posted

技术标签:

【中文标题】Apache Spark:我如何理解和控制我的查询是在 Hive 引擎还是 Spark 引擎上执行的?【英文标题】:Apache Spark: how can I understand and control if my query is executed on Hive engine or on Spark engine? 【发布时间】:2021-03-18 06:55:14 【问题描述】:

我正在运行 spark 2.4.0 的本地实例

我想对 Hive 执行 SQL 查询

在使用 Spark 1.x.x. 之前,我为此使用 HiveContext:

import org.apache.spark.sql.hive.HiveContext
val hc = new org.apache.spark.sql.hive.HiveContext(sc)
val hivequery = hc.sql(“show databases”)

但现在我看到 HiveContext 已被弃用:https://spark.apache.org/docs/2.4.0/api/java/org/apache/spark/sql/hive/HiveContext.html。在 HiveContext.sql() 代码中,我看到它现在只是 SparkSession.sql() 的包装器。建议在 SparkSession 构建器中使用 enableHiveSupport,但正如this 问题所澄清的那样,这只是关于元存储和表列表,这不会改变执行引擎。

所以问题是:

    如何了解我的查询是在 Hive 引擎还是 Spark 引擎上运行? 我该如何控制?

【问题讨论】:

【参考方案1】:

据我了解,没有 Hive 引擎可以运行您的查询。您向 Hive 提交查询,Hive 将在引擎上执行它:

火花 Tez(基于 MapReduce) MapReduce(通常是 Hadoop)

如果您使用 Spark,您的查询将由 Spark 使用 SparkSQL 执行(从 Spark v1.5.x 开始,如果我没记错的话)

Hive 引擎的配置方式取决于配置,我记得在 Cloudera 发行版上看到过 Hive on Spark 配置。 因此 Hive 会使用 Spark 来执行匹配您查询的作业(而不是 MapReduce 或 Tez),但 Hive 会解析、分析它。

使用本地 Spark 实例,您将只使用 Spark 引擎(SparkSQL / Catalyst),但您可以将其与 Hive 支持一起使用。这意味着,您将能够读取现有的 Hive 元存储并与之交互。

它需要带有 Hive 支持的 Spark 安装:Hive 依赖项和类路径中的 hive-site.xml

【讨论】:

nonontb,谢谢!当我们谈论向 Hive 提交查询时,我同意您对 3 个引擎的描述。但是我们将查询提交给 Spark! Spark 可以在自己的引擎上运行 SQL 查询,或者将查询转换到 Hive 并在 Hive 的引擎上运行。我不知道如何跟踪和控制它。 @MiamiBeach 恕我直言,查询没有过渡到 Hive。我不记得这个功能(任何资源?),它没有任何意义。我发现最接近的是 spark thrift (jaceklaskowski.gitbooks.io/mastering-spark-sql/content/…),它不使用 HiveServer2。它取代它以使用 JDBC/ODBC 协议 在该功能出现之前:spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/hive/…,现在已弃用:spark.apache.org/docs/2.4.0/api/java/org/apache/spark/sql/hive/… 是的,这完全是关于使用 Hive 目录:github.com/apache/spark/blob/branch-2.1/sql/hive/src/main/scala/… 没有 Hive 引擎

以上是关于Apache Spark:我如何理解和控制我的查询是在 Hive 引擎还是 Spark 引擎上执行的?的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL 查询:org.apache.spark.sql.AnalysisException

使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

Apache Spark 选择所有行

来自 Apache Spark 的外部配置单元中存在的查询表 [重复]

如何确保我的 Apache Spark 设置代码只运行一次?

工业大数据处理领域的“网红”——Apache Spark