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

  • 我读到Spark-SQL在封面下使用Hive metastore?这是真的?我说的是一个纯粹的Spark-SQL应用程序,该应用程序未显式连接到任何Hive安装。
  • 我正在启动一个Spark-SQL应用程序,不需要使用Hive。有什么理由要使用Hive吗?据我了解,Spark-SQL比Hive快得多。因此,我认为没有任何理由可以使用Hive。但是我正确吗?
  • 最佳答案



    Spark SQL不在幕后使用Hive元存储(除非您在in-memory中进行相反的操作,否则默认为spark-shell非Hive目录)。

    默认的外部目录实现由 spark.sql.catalogImplementation 内部属性控制,并且可以是两个可能的值之一:hivein-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来启动它以将其关闭。



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



    不。

    但是...如果您想使用Spark 2.2的最新功能(即基于成本的优化器),则可能需要考虑将其作为ANALYZE TABLE进行成本统计可能会非常昂贵,因此对于在以下情况下使用过的表进行一次处理在不同的Spark应用程序运行中再次进行操作可以提高性能。

    请注意,没有Hive的Spark SQL也可以做到,但是有一些限制,因为本地默认元存储仅用于单用户访问,并且无法同时使用跨提交的Spark应用程序重用元数据。



    我写了一个博客文章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的metastore)。

    10-06 14:59
    查看更多