Spark SQL主要目的是使得用戶可以在Spark上使用SQL,其數據源既可以是RDD,也可以是外部的數據源(比如文本、Hive、Json等)。Spark SQL的其中一個分支就是Spark on Hive,也就是使用Hive中HQL的解析、邏輯執行計劃翻譯、執行計劃優化等邏輯,可以近似認爲僅將物理執行計劃從MR作業替換成了Spark作業。SparkSql整合hive就是獲取hive表中的元數據信息,然後通過SparkSql來操作數據.
spark整合hive之前應先安裝好hadoop,hive,spark集羣環境
整合步驟:
- 需要將hive-site.xml文件拷貝到Spark的conf目錄下,這樣就可以通過這個配置文件找到Hive的元數據以及數據存放位置。
- 如果Hive的元數據存放在Mysql中,我們還需要準備好Mysql相關驅動,比如:mysql-connector-java-5.1.35.jar
將hive安裝目錄lib文件夾下的Mysql驅動cp到spark的jars
- 將以上兩個文件分發到其他集羣機器上
測試sparksql整合hive是否成功
先啓動hadoop集羣,在啓動spark集羣,確保啓動成功之後執行命令:
/var/local/spark/bin/spark-sql --master spark://node1:7077 --executor-memory 1g --total-executor-cores 2 |
指明master地址、每一個executor的內存大小、一共所需要的核數、
mysql數據庫連接驅動。
執行成功後的界面:進入到spark-sql 客戶端命令行界面
接下來就可以通過sql語句來操作數據庫表:
查看當前有哪些數據庫 ---show databases;
看到以上結果,說明sparksql整合hive成功!
日誌太多,我們可以修改spark的日誌輸出級別(conf/log4j.properties)
前方高能:
在spark2.0版本後由於出現了sparkSession,在初始化sqlContext的時候,會設置默認的spark.sql.warehouse.dir=spark-warehouse,
此時將hive與sparksql整合完成之後,在通過spark-sql腳本啓動的時候,還是會在哪裏啓動spark-sql腳本,就會在當前目錄下創建一個spark.sql.warehouse.dir爲spark-warehouse的目錄,存放由spark-sql創建數據庫和創建表的數據信息,與之前hive的數據信息不是放在同一個路徑下(可以互相訪問)。但是此時spark-sql中表的數據在本地,不利於操作,也不安全。
所有在啓動的時候需要加上這樣一個參數:
--conf spark.sql.warehouse.dir=hdfs://node1:9000/user/hive/warehouse
保證spark-sql啓動時不在產生新的存放數據的目錄,sparksql與hive最終使用的是hive同一存放數據的目錄。
如果使用的是spark2.0之前的版本,由於沒有sparkSession,不會有spark.sql.warehouse.dir配置項,不會出現上述問題。
最後的執行腳本;
spark-sql \ --master spark://node1:7077 \ --executor-memory 1g \ --total-executor-cores 2 \ --conf spark.sql.warehouse.dir=hdfs://node1:9000/user/hive/warehouse |