Hive是目前大數(shù)據(jù)領域保礼,事實上的SQL標準沛励。其底層默認是基于MapReduce實現(xiàn)的责语,但是由于MapReduce速度實在比較慢,因此這兩年目派,陸續(xù)出來了新的SQL查詢引擎坤候。包括Spark SQL,Hive On Tez企蹭,Hive On Spark等白筹。
1.Spark SQL與Hive On Spark
Spark SQL與Hive On Spark是不一樣的。Spark SQL是Spark自己研發(fā)出來的針對各種數(shù)據(jù)源练对,包括Hive遍蟋、JSON、Parquet螟凭、JDBC虚青、RDD等都可以執(zhí)行查詢的,一套基于Spark計算引擎的查詢引擎螺男。因此它是Spark的一個項目棒厘,只不過提供了針對Hive執(zhí)行查詢的工功能而已。適合在一些使用Spark技術棧的大數(shù)據(jù)應用類系統(tǒng)中使用下隧。
而Hive On Spark奢人,是Hive的一個項目,它是指淆院,不通過MapReduce作為唯一的查詢引擎何乎,而是將Spark作為底層的查詢引擎。Hive On Spark土辩,只適用于Hive支救。在可預見的未來,很有可能Hive默認的底層引擎就從MapReduce切換為Spark了拷淘。適合于將原有的Hive數(shù)據(jù)倉庫以及數(shù)據(jù)統(tǒng)計分析替換為Spark引擎各墨,作為全公司通用的大數(shù)據(jù)統(tǒng)計分析引擎。
2.Hive的基本工作原理:
Hive QL語句 =>
語法分析 => AST =>
生成邏輯執(zhí)行計劃 => Operator Tree =>
優(yōu)化邏輯執(zhí)行計劃 => Optimized Operator Tree =>
生成物理執(zhí)行計劃 => Task Tree =>
優(yōu)化物理執(zhí)行計劃 => Optimized Task Tree =>
執(zhí)行優(yōu)化后的Optimized Task Tree
3.Hive On Spark的計算原理
1启涯、將Hive表作為Spark RDD來進行操作:這個是沒有疑問的
2贬堵、使用Hive原語
對于一些針對RDD的操作,比如groupByKey结洼、sortByKey等黎做。不使用Spark的transformation操作和原語。如果那樣做的話松忍,那么就需要重新實現(xiàn)一套Hive的原語引几,而且如果Hive增加了新功能,那么又要實現(xiàn)新的Spark原語。因此選擇將Hive的原語包裝為針對RDD的操作即可伟桅。
3敞掘、新的物理執(zhí)行計劃生成機制
使用SparkCompiler將邏輯執(zhí)行計劃,即Operator Tree楣铁,轉換為Task Tree玖雁。提交Spark Task給Spark進行執(zhí)行。SparkTask包裝了DAG盖腕,DAG包裝為SparkWork赫冬。SparkTask根據(jù)SparkWork表示的DAG計算。
4溃列、SparkContext生命周期
Hive On Spark會為每個用戶的會話劲厌,比如執(zhí)行一次SQL語句,創(chuàng)建一個SparkContext听隐。但是Spark不允許在一個JVM內創(chuàng)建多個SparkContext补鼻。因此,需要在單獨的JVM中啟動每個會話的SparkContext雅任,然后通過RPC與遠程JVM中的SparkContext進行通信风范。
5、本地和遠程運行模式
Hive On Spark提供兩種運行模式沪么,本地和遠程硼婿。如果將Spark Master設置為local,比如set spark.master=local禽车,那么就是本地模式寇漫,SparkContext與客戶端運行在一個JVM中。否則殉摔,如果將Spark Master設置為Master的地址州胳,那么就是遠程模式,SparkContext會在遠程的JVM中啟動钦勘。
遠程模式下,每個用戶Session都會創(chuàng)建一個SparkClient亚亲,SparkClient啟動RemoteDriver彻采,RemoteDriver負責創(chuàng)建SparkContext。
4.Hive On Spark的一些優(yōu)化
1捌归、Map Join
Spark SQL默認對join是支持使用broadcast機制將小表廣播到各個節(jié)點上肛响,以進行join的。但是問題是惜索,這會給Driver和Worker帶來很大的內存開銷特笋。因為廣播的數(shù)據(jù)要一直保留在Driver內存中。所以目前采取的是,類似乎MapReduce的Distributed Cache機制猎物,即提高HDFS replica factor的復制因子虎囚,以讓數(shù)據(jù)在每個計算節(jié)點上都有一個備份,從而可以在本地進行數(shù)據(jù)讀取蔫磨。
2淘讥、Cache Table
對于某些需要對一張表執(zhí)行多次操作的場景,Hive On Spark內部做了優(yōu)化堤如,即將要多次操作的表cache到內存中蒲列,以便于提升性能。但是這里要注意搀罢,并不是對所有的情況都會自動進行cache蝗岖。所以說,Hive On Spark還有很多不完善的地方榔至。
5.Hive On Spark環(huán)境搭建
1抵赢、安裝包:apache-hive-1.2.1-bin.tar.gz
2、在/usr/local目錄下解壓縮
3洛退、進入conf目錄瓣俯,mv hive-default.xml.template hive-site.xml,修改hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://spark1:3306/hive_metadata_2?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse2</value>
</property>
4兵怯、在conf目錄下
mv hive-env.sh.template hive-env.sh
vi ./bin/hive-config.sh
export JAVA_HOME=/usr/java/latest
export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin
export HADOOP_HOME=/usr/local/hadoop
5彩匕、cp /usr/share/java/mysql-connector-java-5.1.17.jar /usr/local/apache-hive-1.2.1-bin/lib
6、MySQL
create database if not exists hive_metadata_2;
grant all privileges on hive_metadata_2.* to 'hive'@'%' identified by 'hive';
grant all privileges on hive_metadata_2.* to 'hive'@'localhost' identified by 'hive';
grant all privileges on hive_metadata_2.* to 'hive'@'spark1' identified by 'hive';
flush privileges;
7媒区、啟動hive cli驼仪,./hive,報錯袜漩,Relative path in absolute URI: %7Bsystem:user.name%7D
創(chuàng)建文件夾:/home/grid/apache-hive-1.2.1-bin
/iotmp
將hive-site.xml中所有的${system:java.io.tmpdir}改為上面的目錄绪爸,這里建議用WinSCP將hive-site.xml拷貝到windows上來,用notepad++這種工具宙攻,來進行文本替換奠货,比較方便。
8座掘、啟動hive cli递惋,./hive,繼續(xù)報錯溢陪,F(xiàn)ound class jline.Terminal, but interface was expected
cp /usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib
將hadoop原來的老的jline-0.9.94.jar萍虽,改名或者刪除
9、啟動hive cli形真,/usr/local/apache-hive-1.2.1-bin/bin/hive杉编,成功啟動
6.Hive On Spark使用
create table students(name string, age int);
load data local inpath '/usr/local/spark-study/resources/students.txt' into table students;
使用Hive On Spark非常簡單,只要用set hive.execution.engine命令設置Hive的執(zhí)行引擎為spark即可,默認是mr
set hive.execution.engine=spark;
這里邓馒,是完全可以將其設置為Spark Master的URL地址的
set spark.master=spark://192.168.1.107:7077
select * from students;