【问题标题】:Spark 2: how does it work when SparkSession enableHiveSupport() is invokedSpark 2:调用 SparkSession enableHiveSupport() 时如何工作
【发布时间】:2019-02-09 15:46:40
【问题描述】:

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

我有 Spark2CDH 5.10 集群上运行。 还有 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。

【问题讨论】:

    标签: apache-spark hive apache-spark-sql hiveql


    【解决方案1】:

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

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

    *实际上有一些函数,如 percentilepercentile_approx,它们是原生 hive UDAF。

    【讨论】:

    • 在 v2.4.2 中,我使用 spark.catalog.listTables() 而不是 spark.catalog.listTables().show(),因为 list 对象不存在 show()。
    • @SaulCruz 我的解决方案也适用于 2.4.2。 listTables() 返回一个具有show 方法的数据集
    • 很有趣,我不确定当时缺少什么
    • @SaulCruz 也许你没有使用 Scala?
    • 哈哈@RaphaelRoth 就是这样,我还以为帖子是 pyspark,不错!
    【解决方案2】:

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

    这只是关于 Hive 目录。如果你使用enableHiveSupport,那么你可以:

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

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

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

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

    如上所述,这是Spark的性能

    【讨论】:

      【解决方案3】:

      "在后台,此查询被转换为 Hive MapReduce 原语,或者 对 HiveQL 的支持仅在语法级别,Spark SQL 将在后台使用。”

      我在 Hive 元存储上使用 spark SQL。我验证查询是否转换为 Map/Reduce 的方法是检查: 一种。打开 Hive 控制台并使用一些过滤器运行一个简单的 SELECT 查询。现在转到 YARN 资源管理器。您将看到一些 Map/reduce 作业因执行查询而被触发。 湾。使用 HiveContext 运行 spark SQL 并执行相同的 SQL 查询。 Spark SQL 将利用 Hive 的元存储信息而不触发 Map/Reduce 作业。转到 YARN 中的资源管理器并验证它。您只会发现 spark-shell 会话正在运行,并且不会在集群上触发额外的 Map/Reduce 作业。

      【讨论】:

        【解决方案4】:

        共有三个执行引擎,MapReduceTezSpark

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

        set hive.execution.engine=tez;
        

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

        但是,如果您在进行性能分析,您应该衡量的不仅仅是时间,还应该衡量内存和 CPU。

        【讨论】:

        • 我检查了一下,它是 MapReduce (mr)。这是否意味着 SparkHiveQL 查询转发到 Hive,后者将其转换为 MR 作业?所以我想我可以声称我的性能结果是指使用 MR 作为执行引擎的 HiveQL
        • @AnthonyArrascue Spark 不转发任何查询到 hive,它使用自己的引擎 Spark 来执行查询。但是,您的 Hive 使用 MR 执行查询。
        • 这没有回答问题。您正在谈论的执行引擎特定于 Hive。 Spark 上的 Hive 不同于通过 Spark 在 Hive 上执行查询。
        • @philantrovert 这就是我所说的,从 spark 执行 hive 查询将使用 spark 执行引擎,而不是使用 hive 设置的引擎。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 2017-02-08
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多