Spark 集成 Hive

 Hive查詢流程及原理

執行HQL時,先到MySQL元數據庫中查找描述信息,然後解析HQL並根據描述信息生成MR任務

Hive將SQL轉成MapReduce執行速度慢

 

使用SparkSQL整合Hive其實就是讓SparkSQL去加載Hive 的元數據庫,然後通過SparkSQL執行引擎去操作Hive表內的數據

所以首先需要開啓Hive的元數據庫服務,讓SparkSQL能夠加載元數據

 Hive開啓MetaStore服務

nohup /export/servers/hive-1.1.0-cdh5.14.0/bin/hive --service metastore 2>&1  &

 修改 hive/conf/hive-site.xml 新增如下配置

 <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>/user/hive/warehouse</value>
    </property>
    <property>
      <name>hive.metastore.local</name>
      <value>false</value>
    </property>
    <property>
      <name>hive.metastore.uris</name>
      <value>thrift://node01:9083</value>
    </property>

2: 後臺啓動 Hive MetaStore服務

nohup /export/servers/hive/bin/hive --service metastore 2>&1 >> /var/log.log &

  1. SparkSQL整合Hive MetaStore

Spark 有一個內置的 MateStore,使用 Derby 嵌入式數據庫保存數據,但是這種方式不適合生產環境,因爲這種模式同一時間只能有一個 SparkSession 使用,所以生產環境更推薦使用 Hive 的 MetaStore

SparkSQL 整合 Hive 的 MetaStore 主要思路就是要通過配置能夠訪問它, 並且能夠使用 HDFS 保存 WareHouse,所以可以   直接拷貝 Hadoop 和 Hive 的配置文件到 Spark 的配置目錄

hive-site.xml 元數據倉庫的位置等信息

core-site.xml 安全相關的配置

hdfs-site.xml HDFS 相關的配置

  1.  使用SparkSQL操作Hive表    (先把 target 文件刪除掉 然後重新執行 main 方法 
  2. package SparkHive
    
    
    import org.apache.spark.sql.SparkSession
    
    /**
      * Created by 一個蔡狗 on 2020/4/14.
      */
    object SparkHive_1 {
    
    
      def main(args: Array[String]): Unit = {
        //創建sparkSession
        val spark = SparkSession
          .builder()
          .appName("HiveSupport")
          .master("local[*]")
          //.config("spark.sql.warehouse.dir", "hdfs://node01:8020/user/hive/warehouse")
          //.config("hive.metastore.uris", "thrift://node01:9083")
          .enableHiveSupport() //開啓hive語法的支持
          .getOrCreate()
        spark.sparkContext.setLogLevel("WARN")
    
        //查看有哪些表
        spark.sql("show databases").show()
    
        //創建表
        //    spark.sql("CREATE TABLE person (id int, name string, age int) row format delimited fields terminated by ' '")
    
        //加載數據,數據爲當前SparkDemo項目目錄下的person.txt(和src平級)
        //    spark.sql("LOAD DATA LOCAL INPATH 'SparkDemo/person.txt' INTO TABLE person")
    
        //查詢數據
        //    spark.sql("select * from person ").show()
    
        spark.stop()
      }
    
    
    }
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章