Spark從入門到精通31:Spark SQL:Hive On Spark

Hive是目前大數(shù)據(jù)領(lǐng)域,事實(shí)上的SQL標(biāo)準(zhǔn)。其底層默認(rèn)是基于MapReduce實(shí)現(xiàn)的,但是由于MapReduce速度實(shí)在比較慢,因此這兩年,陸續(xù)出來(lái)了新的SQL查詢引擎。包括Spark SQL,Hive On Tez,Hive On Spark等。

1.Spark SQL與Hive On Spark

Spark SQL與Hive On Spark是不一樣的。Spark SQL是Spark自己研發(fā)出來(lái)的針對(duì)各種數(shù)據(jù)源,包括Hive、JSON、Parquet、JDBC、RDD等都可以執(zhí)行查詢的,一套基于Spark計(jì)算引擎的查詢引擎。因此它是Spark的一個(gè)項(xiàng)目,只不過(guò)提供了針對(duì)Hive執(zhí)行查詢的工功能而已。適合在一些使用Spark技術(shù)棧的大數(shù)據(jù)應(yīng)用類系統(tǒng)中使用。
而Hive On Spark,是Hive的一個(gè)項(xiàng)目,它是指,不通過(guò)MapReduce作為唯一的查詢引擎,而是將Spark作為底層的查詢引擎。Hive On Spark,只適用于Hive。在可預(yù)見(jiàn)的未來(lái),很有可能Hive默認(rèn)的底層引擎就從MapReduce切換為Spark了。適合于將原有的Hive數(shù)據(jù)倉(cāng)庫(kù)以及數(shù)據(jù)統(tǒng)計(jì)分析替換為Spark引擎,作為全公司通用的大數(shù)據(jù)統(tǒng)計(jì)分析引擎。

2.Hive的基本工作原理:

Hive QL語(yǔ)句 =>
語(yǔ)法分析 => AST =>
生成邏輯執(zhí)行計(jì)劃 => Operator Tree =>
優(yōu)化邏輯執(zhí)行計(jì)劃 => Optimized Operator Tree =>
生成物理執(zhí)行計(jì)劃 => Task Tree =>
優(yōu)化物理執(zhí)行計(jì)劃 => Optimized Task Tree =>
執(zhí)行優(yōu)化后的Optimized Task Tree

3.Hive On Spark的計(jì)算原理

1、將Hive表作為Spark RDD來(lái)進(jìn)行操作:這個(gè)是沒(méi)有疑問(wèn)的

2、使用Hive原語(yǔ)
對(duì)于一些針對(duì)RDD的操作,比如groupByKey、sortByKey等。不使用Spark的transformation操作和原語(yǔ)。如果那樣做的話,那么就需要重新實(shí)現(xiàn)一套Hive的原語(yǔ),而且如果Hive增加了新功能,那么又要實(shí)現(xiàn)新的Spark原語(yǔ)。因此選擇將Hive的原語(yǔ)包裝為針對(duì)RDD的操作即可。

3、新的物理執(zhí)行計(jì)劃生成機(jī)制
使用SparkCompiler將邏輯執(zhí)行計(jì)劃,即Operator Tree,轉(zhuǎn)換為Task Tree。提交Spark Task給Spark進(jìn)行執(zhí)行。SparkTask包裝了DAG,DAG包裝為SparkWork。SparkTask根據(jù)SparkWork表示的DAG計(jì)算。
4、SparkContext生命周期
Hive On Spark會(huì)為每個(gè)用戶的會(huì)話,比如執(zhí)行一次SQL語(yǔ)句,創(chuàng)建一個(gè)SparkContext。但是Spark不允許在一個(gè)JVM內(nèi)創(chuàng)建多個(gè)SparkContext。因此,需要在單獨(dú)的JVM中啟動(dòng)每個(gè)會(huì)話的SparkContext,然后通過(guò)RPC與遠(yuǎn)程JVM中的SparkContext進(jìn)行通信。

5、本地和遠(yuǎn)程運(yùn)行模式
Hive On Spark提供兩種運(yùn)行模式,本地和遠(yuǎn)程。如果將Spark Master設(shè)置為local,比如set spark.master=local,那么就是本地模式,SparkContext與客戶端運(yùn)行在一個(gè)JVM中。否則,如果將Spark Master設(shè)置為Master的地址,那么就是遠(yuǎn)程模式,SparkContext會(huì)在遠(yuǎn)程的JVM中啟動(dòng)。

遠(yuǎn)程模式下,每個(gè)用戶Session都會(huì)創(chuàng)建一個(gè)SparkClient,SparkClient啟動(dòng)RemoteDriver,RemoteDriver負(fù)責(zé)創(chuàng)建SparkContext。

4.Hive On Spark的一些優(yōu)化

1、Map Join
Spark SQL默認(rèn)對(duì)join是支持使用broadcast機(jī)制將小表廣播到各個(gè)節(jié)點(diǎn)上,以進(jìn)行join的。但是問(wèn)題是,這會(huì)給Driver和Worker帶來(lái)很大的內(nèi)存開(kāi)銷。因?yàn)閺V播的數(shù)據(jù)要一直保留在Driver內(nèi)存中。所以目前采取的是,類似乎MapReduce的Distributed Cache機(jī)制,即提高HDFS replica factor的復(fù)制因子,以讓數(shù)據(jù)在每個(gè)計(jì)算節(jié)點(diǎn)上都有一個(gè)備份,從而可以在本地進(jìn)行數(shù)據(jù)讀取。

2、Cache Table
對(duì)于某些需要對(duì)一張表執(zhí)行多次操作的場(chǎng)景,Hive On Spark內(nèi)部做了優(yōu)化,即將要多次操作的表cache到內(nèi)存中,以便于提升性能。但是這里要注意,并不是對(duì)所有的情況都會(huì)自動(dòng)進(jìn)行cache。所以說(shuō),Hive On Spark還有很多不完善的地方。

5.Hive On Spark環(huán)境搭建

1、安裝包:apache-hive-1.2.1-bin.tar.gz
2、在/usr/local目錄下解壓縮
3、進(jìn)入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、啟動(dòng)hive cli,./hive,報(bào)錯(cuò),Relative path in absolute URI: {system:java.io.tmpdir%7D/%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上來(lái),用notepad++這種工具,來(lái)進(jìn)行文本替換,比較方便。

8、啟動(dòng)hive cli,./hive,繼續(xù)報(bào)錯(cuò),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原來(lái)的老的jline-0.9.94.jar,改名或者刪除

9、啟動(dòng)hive cli,/usr/local/apache-hive-1.2.1-bin/bin/hive,成功啟動(dòng)

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非常簡(jiǎn)單,只要用set hive.execution.engine命令設(shè)置Hive的執(zhí)行引擎為spark即可,默認(rèn)是mr
set hive.execution.engine=spark;
這里,是完全可以將其設(shè)置為Spark Master的URL地址的
set spark.master=spark://192.168.1.107:7077
select * from students;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,929評(píng)論 0 13
  • 1、背景 Hive是目前大數(shù)據(jù)領(lǐng)域,事實(shí)上的SQL標(biāo)準(zhǔn)。其底層默認(rèn)是基于MapReduce實(shí)現(xiàn)的,但是由于MapR...
    雪飄千里閱讀 2,738評(píng)論 0 4
  • Hive概述 Hive 是基于 Hadoop 的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供...
    董二彎閱讀 9,419評(píng)論 0 10
  • Spark學(xué)習(xí)筆記 Data Source->Kafka->Spark Streaming->Parquet->S...
    哎喲喂嘍閱讀 6,848評(píng)論 0 51
  • 今天是第二節(jié)課《夢(mèng)想的力量》,聽(tīng)了以后感觸很深! 課程中,美娟老師用她不疾不徐的聲音波瀾不驚的講述著一個(gè)6歲孩子的...
    lxh星華閱讀 692評(píng)論 0 0

友情鏈接更多精彩內(nèi)容