概述
●官網
http://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html
Configuration of Hive is done by placing your hive-site.xml, core-site.xml (for security configuration), and hdfs-site.xml (for HDFS configuration) file in conf/.
●Hive查詢流程及原理
執行HQL時,先到MySQL元數據庫中查找描述信息,然後解析HQL並根據描述信息生成MR任務
Hive將SQL轉成MapReduce執行速度慢
使用SparkSQL整合Hive其實就是讓SparkSQL去加載Hive 的元數據庫,然後通過SparkSQL執行引擎去操作Hive表內的數據
所以首先需要開啓Hive的元數據庫服務,讓SparkSQL能夠加載元數據
Hive開啓MetaStore服務
1: 修改 hive/conf/hive-site.xml 新增如下配置
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<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>
</configuration>
2: 後臺啓動 Hive MetaStore服務
nohup /export/servers/hive/bin/hive --service metastore 2>&1 >> /var/log.log &
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 相關的配置
使用IDEA本地測試直接把以上配置文件放在resources目錄即可
使用SparkSQL操作Hive表
package cn.itcast.sql
import org.apache.spark.sql.SparkSession
object HiveSupport {
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 tables").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()
}
}