【问题标题】:Does Spark SQL use Hive Metastore?Spark SQL 是否使用 Hive Metastore?
【发布时间】:2019-02-18 17:36:50
【问题描述】:

我正在开发一个 Spark SQL 应用程序,但我有几个问题:

  1. 我听说 Spark-SQL 在背后使用 Hive 元存储?这是真的?我说的是一个纯 Spark-SQL 应用程序,它没有显式连接到任何 Hive 安装。
  2. 我正在启动一个 Spark-SQL 应用程序,并且不需要使用 Hive。有任何理由使用 Hive 吗?据我了解,Spark-SQL 比 Hive 快得多;所以,我看不出有任何理由使用 Hive。但我说的对吗?

【问题讨论】:

  • Spark 引导一个伪 Metastore(嵌入式 Derby DB)供内部使用,并且可选地使用实际的 Hive Metastore 来读取/写入持久性 Hadoop 数据。这并不意味着 Spark 使用 Hive I/O 库,仅使用 Hive 元数据。
  • 你好@SamsonScharfrichter 我有一个案例,我在DESCRIBE DETAIL table 和我从hiveMetastore 数据库中检索到的数据之间存在一些不一致。该案例描述为here。你知道 Delta 表位置是如何确定的吗?

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


【解决方案1】:

我读到 Spark-SQL 在后台使用 Hive 元存储?这是真的?我说的是一个纯 Spark-SQL 应用程序,它没有显式连接到任何 Hive 安装。

Spark SQL 不会在后台使用 Hive 元存储(默认为 in-memory 非 Hive 目录,除非您在 spark-shell 中相反)。

默认的外部目录实现由 spark.sql.catalogImplementation 内部属性控制,可以是以下两个可能值之一:hive 和 in-memory。

使用SparkSession 了解正在使用的目录。

scala> :type spark
org.apache.spark.sql.SparkSession

scala> spark.version
res0: String = 2.4.0

scala> :type spark.sharedState.externalCatalog
org.apache.spark.sql.catalyst.catalog.ExternalCatalogWithListener

scala> println(spark.sharedState.externalCatalog.unwrapped)
org.apache.spark.sql.hive.HiveExternalCatalog@49d5b651

请注意,我使用了 spark-shell,它确实启动了 Hive 感知 SparkSession,因此我必须以 --conf spark.sql.catalogImplementation=in-memory 启动它才能将其关闭。

我正在启动一个 Spark-SQL 应用程序,并且不需要使用 Hive。有任何理由使用 Hive 吗?据我了解,Spark-SQL 比 Hive 快得多;所以,我认为没有任何理由使用 Hive。

这是一个非常有趣的问题,可以有不同的答案(有些甚至主要基于意见,因此我们必须格外小心并遵守 StackOverflow 规则)。

有什么理由使用 Hive?

没有。

但是...如果您想使用 Spark 2.2 的最新功能,即基于成本的优化器,您可能希望将其视为ANALYZE TABLE,因为成本统计可能相当昂贵,因此对表执行一次在不同的 Spark 应用程序运行中反复使用可以提高性能。

请注意,没有 Hive 的 Spark SQL 也可以这样做,但有一些限制,因为本地默认元存储仅用于单用户访问,并且在同时提交的 Spark 应用程序中重用元数据将不起作用。

我认为没有任何理由使用 Hive。

我写了一篇博文Why is Spark SQL so obsessed with Hive?! (after just a single day with Hive),在那里我问了一个类似的问题,令我惊讶的是,直到现在(我在 2016 年 4 月 9 日发布博文后差不多一年)我想我可能已经理解了这个概念的原因Hive Metastore 非常重要,尤其是。在多用户 Spark 笔记本环境中。

Hive 本身只是 HDFS 上的一个数据仓库,所以如果你有 Spark SQL 的话用处不大,但是仍然有一些 Hive 做得相当好的概念在 Spark SQL 中很有用(直到它完全站在它的具有类似 Hive 的元存储的自己的腿)。

【讨论】:

  • 当您说 Spark 默认不使用 Hive Metastore 时,您似乎自相矛盾:jaceklaskowski.gitbooks.io/mastering-spark-sql/…。同样在这里它说“Spark 将为您创建一个默认的本地 Hive 元存储(使用 Derby)。” spark.apache.org/docs/latest/…
  • @JacekLaskowski,现在看来这种行为不同了。从 spark 2.4.5 开始,spark shell 以 inmemory 作为目录启动 sparksession。如何在配置中改用“hive”?
  • 一个简单的命令比如 spark-shell --conf spark.sql.catalogImplementation=hive 没有帮助
  • 在 Spark 3.1.2 中,您可以将 hive-site.xml 放在 conf 目录中,然后 spark-shell 将使用 hive metastore auto。确保在hive-site.xml文件中设置了相关配置。
  • 找到答案:临时视图是绑定到 SparkSession 对象的短期对象
【解决方案2】:

如果在初始化 HiveContext() 对象或 spark-shell 时没有找到,它将连接到 Hive Metastore 或实例化一个。

使用 Hive 的主要原因是,如果您从 Hive 的托管表中读取 HDFS 数据,或者您希望从外部表中选择方便。

请记住,Hive 只是用于读取和写入 HDFS 文件的镜头,而不是其本身的执行引擎。

【讨论】:

  • 对 SQLContext 对象做同样的事情吗?使用 SQLContext 或 SparkSession.sql 创建的表的元数据在哪里管理?
猜你喜欢
  • 2017-04-29
  • 2022-01-25
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多