1. 程式人生 > >SparkSQL & Spark on Hive & Hive on Spark

SparkSQL & Spark on Hive & Hive on Spark

單獨 bmi 查詢 數據信息 mar src detail ado 序列

剛開始接觸Spark被Hive在Spark中的作用搞得雲裏霧裏,這裏簡要介紹下,備忘。

參考:https://blog.csdn.net/zuochang_liu/article/details/82292076

SparkSQL:是一個完全不依賴Hive的SQL引擎。

Spark On Hive

通過sparksql,加載hive的配置文件,獲取到hive的元數據信息;spark sql獲取到hive的元數據信息之後就可以拿到hive的所有表的數據;接下來就可以通過spark sql來操作hive表中的數據。也就是說僅僅是將Hive作為一個數據倉庫,並沒有用到Hive的SQL執行引擎的能力。代碼在內核代碼spark-hive_2.11工程中。

Hive On Spark

是把hive查詢從mapreduce 的mr (hadoop 計算引擎)操作替換為spark rdd 操作;將HQL翻譯成分布式可以執行的Spark程序。Hive和SparkSQL都不負責計算。也就是一個為Spark計算框架定制的Hive。和Hive基本上沒有關系,耦合之處為:HQL、元數據庫、UDF、序列化、反序列化機制。它是一個單獨的工程,和Spark內核代碼獨立,但是Spark依賴於Hive On Spark, Spark中的某些模塊執行過程中會調用Hive on Spark. 例如Spark JDBCServer:

技術分享圖片

Hive原來的計算模型是MR,頻繁操作磁盤(將中間結果寫入到HDFS中)效率低。而Hive On Spark中使用了RDD(Dataframe),然後運行在spark集群上面。元數據保存在mysql中,其中包含了hive表的描述信息,描述了那些數據庫、表,以及表有多少列,每一列都是什麽類型,還要描述表的數據保存在HDFS的什麽位置。

Hive元數據庫的功能

  hive的元數據(metadata)建立了一種映射關系,執行HQL是,先到Mysql元數據庫中查找描述信息,然後根據描述信息生成任務,然後將任務下發到spark集群中執行。hive on spark使用的僅僅是hive的標準和規範,不需要有hive數據庫一樣可以使用。要使用Hive的標準需要將hive的配置文件放在spark的conf目錄下。沒有安裝Hive組件也沒有影響。

要在Spark-Submit進程中使用開啟spark對hive的支持:

val session = SparkSession.builder()
  .master("local")
  .appName("xx")
  .enableHiveSupport() 
  .getOrCreate()

  

SparkSQL & Spark on Hive & Hive on Spark