我正在开发Spark SQL应用程序,我几乎没有问题:
答案 0 :(得分:6)
我读过Spark-SQL在封面下使用Hive Metastore?这是真的?我正在谈论一个没有明确连接到任何Hive安装的纯Spark-SQL应用程序。
Spark SQL不会在封面下使用Hive Metastore(默认为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也可以这样做,但有一些限制,因为本地默认的Metastore仅用于单用户访问,并且在同时提交的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中有很多用处(直到完全站立起来)在自己的腿上,有一个类似蜂巢的环氧树脂)。
答案 1 :(得分:1)
如果初始化HiveContext()对象或spark-shell,它将连接到Hive Metastore或实例化一个Hive Metastore。
使用Hive的主要原因是,如果您正在从Hive的托管表中读取HDFS数据,或者您希望方便从外部表中进行选择。
请记住,Hive只是用于读取和写入HDFS文件的镜头,而不仅仅是执行引擎本身。