我读到 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 的元存储的自己的腿)。