Hive詳細(xì)教案

一. 什么是hive

hive是基于Hadoop的一個(gè)[數(shù)據(jù)倉(cāng)庫(kù)]工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供簡(jiǎn)單的sql查詢功能,可以將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。 其優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過(guò)類SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專門的MapReduce應(yīng)用,十分適合[數(shù)據(jù)倉(cāng)庫(kù)]的統(tǒng)計(jì)分析。

數(shù)據(jù)倉(cāng)庫(kù)

[數(shù)據(jù)倉(cāng)庫(kù)],英文名稱為Data Warehouse,可簡(jiǎn)寫為[DW]或DWH。數(shù)據(jù)倉(cāng)庫(kù),是為企業(yè)所有級(jí)別的決策制定過(guò)程,提供所有類型數(shù)據(jù)支持的戰(zhàn)略[集合]。它是單個(gè)數(shù)據(jù)存儲(chǔ),出于分析性報(bào)告和決策支持目的而創(chuàng)建。 為需要業(yè)務(wù)智能的企業(yè),提供指導(dǎo)業(yè)務(wù)流程改進(jìn)、監(jiān)視時(shí)間、成本、質(zhì)量以及控制,**簡(jiǎn)而言之,數(shù)據(jù)倉(cāng)庫(kù)是用來(lái)做查詢分析的數(shù)據(jù)庫(kù),基本不用來(lái)做插入,修改,刪除

Hive架構(gòu)原理

1.jpg
**Hive****執(zhí)行流程**

?編譯器將一個(gè)Hive QL轉(zhuǎn)換操作符

?操作符是Hive的最小的處理單元

?每個(gè)操作符代表HDFS的一個(gè)操作或者一道MapReduce作業(yè)

**Operator**

?Operator都是hive定義的一個(gè)處理過(guò)程

?Operator都定義有:

?protected List **<Operator<?**  **extends** Serializable **>>** childOperators; 

?protected List **<Operator<?**  **extends** Serializable **>>** parentOperators; 

?protected boolean done; // 初始化值為false

?所有的操作構(gòu)成了 Operator圖,hive正是基于這些圖關(guān)系來(lái)處理諸如limit, group by, join等操作
1.jpg

Hive****執(zhí)行流程

1.jpg

Hive****編譯器

1.jpg
1.jpg

二.hive三種方式區(qū)別和搭建

Hive中metastore(元數(shù)據(jù)存儲(chǔ))的三種方式

a)內(nèi)嵌Derby方式

b)Local方式

c)Remote方式

1.本地derby

這種方式是最簡(jiǎn)單的存儲(chǔ)方式,只需要在hive-site.xml做如下配置便可

<?xml version="1.0"?>  

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  

<configuration>  

<property>  

  <name>javax.jdo.option.ConnectionURL</name>  

  <value>jdbc:derby:;databaseName=metastore_db;create=true</value>  

</property>  

<property>  

  <name>javax.jdo.option.ConnectionDriverName</name>  

  <value>org.apache.derby.jdbc.EmbeddedDriver</value>  

</property>  

<property>  

  <name>hive.metastore.local</name>  

  <value>true</value>  

</property>  

<property>  

  <name>hive.metastore.warehouse.dir</name>  

  <value>/user/hive/warehouse</value>  

</property>  

</configuration>  

注:使用derby存儲(chǔ)方式時(shí),運(yùn)行hive會(huì)在當(dāng)前目錄生成一個(gè)derby文件和一個(gè)metastore_db目錄。這種存儲(chǔ)方式的弊端是在同一個(gè)目錄下同時(shí)只能有一個(gè)hive客戶端能使用數(shù)據(jù)庫(kù),否則會(huì)提示如下錯(cuò)誤

[html] [view plain](http://blog.csdn.net/reesun/article/details/8556078 "view plain")[copy](http://blog.csdn.net/reesun/article/details/8556078 "copy")[print](http://blog.csdn.net/reesun/article/details/8556078 "print")[?](http://blog.csdn.net/reesun/article/details/8556078 "?")

hive> show tables;  

FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.  

NestedThrowables:  

java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.  

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask  

hive> show tables;

FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.

NestedThrowables:

java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

2.本地mysql

這種存儲(chǔ)方式需要在本地運(yùn)行一個(gè)mysql服務(wù)器,并作如下配置(下面兩種使用mysql的方式,需要將mysql的jar包拷貝到$HIVE_HOME/lib目錄下)。

<?xml version="1.0"?>  

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  

<configuration>  

<property>  

  <name>hive.metastore.warehouse.dir</name>  

  <value>/user/hive_remote/warehouse</value>  

</property>  

<property>  

  <name>hive.metastore.local</name>  

  <value>true</value>  

</property>  

<property>  

  <name>javax.jdo.option.ConnectionURL</name>  

  <value>jdbc:mysql://localhost/hive_remote?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>password</value>  

</property>  

</configuration>  

3..遠(yuǎn)端mysql

1.remote一體

這種存儲(chǔ)方式需要在遠(yuǎn)端服務(wù)器運(yùn)行一個(gè)mysql服務(wù)器,并且需要在Hive服務(wù)器啟動(dòng)meta服務(wù)。

這里用mysql的測(cè)試服務(wù)器,ip位192.168.1.214,新建hive_remote數(shù)據(jù)庫(kù),字符集位****latine1

<?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>javax.jdo.option.ConnectionURL</name>  

  <value>jdbc:mysql://192.168.57.6:3306/hive?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>password</value>  

</property>  

<property>  

  <name>hive.metastore.local</name>  

  <value>false</value>  

</property>  

<property>  

  <name>hive.metastore.uris</name>  

  <value>thrift://192.168.1.188:9083</value>  

</property>  

</configuration>  

注:這里把hive****的服務(wù)端和客戶端都放在同一臺(tái)服務(wù)器上了。服務(wù)端和客戶端可以拆開(kāi),

2.Remote分開(kāi)

將hive-site.xml配置文件拆為如下兩部分

** 1****)、服務(wù)端配置文件**

<?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>javax.jdo.option.ConnectionURL</name>  

  <value>jdbc:mysql://192.168.57.6:3306/hive?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>root</value>  

</property>  

<property>  

  <name>javax.jdo.option.ConnectionPassword</name>  

  <value>123456</value>  

</property>  

</configuration>  
    ** 2****)、客戶端配置文件**
<?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://192.168.57.5:9083</value>  

</property>  

</configuration>  

啟動(dòng)hive服務(wù)端程序

hive --service metastore

客戶端直接使用hive命令即可

root@my188:~$ hive   

Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt  

hive> show tables;  

OK  

test_hive  

Time taken: 0.736 seconds  

hive>  

三.Hive的數(shù)據(jù)類型和DDL

具體參見(jiàn)https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

重點(diǎn)是hive 的建表語(yǔ)句和分區(qū)

四.Hive的數(shù)據(jù)加載和DML

具體參見(jiàn)https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

重點(diǎn)是數(shù)據(jù)加載和查詢插入語(yǔ)法

五.Hiveserver2和hive JDBC

企業(yè)用hive的-e -f -i三個(gè)參數(shù)

1.jpg
1.jpg

1.jpg

六.Hive的UDF和UDAF UDTF

自定義函數(shù)包括三種UDF、UDAF、UDTF

UDF(User-Defined-Function) 一進(jìn)一出

UDAF(User- Defined Aggregation Funcation) 聚集函數(shù),多進(jìn)一出。Count/max/min

UDTF(User-Defined Table-Generating Functions)? 一進(jìn)多出,如lateral view explore()

使用方式 :在HIVE會(huì)話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function繼而使用函數(shù)

UDF****開(kāi)發(fā)

1、UDF函數(shù)可以直接應(yīng)用于select語(yǔ)句,對(duì)查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容。

2、編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn):

a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。

b)需要實(shí)現(xiàn)evaluate函數(shù),evaluate函數(shù)支持重載。

3、步驟

a)把程序打包放到目標(biāo)機(jī)器上去;

b)進(jìn)入hive客戶端,添加jar包:hive>add jar /run/jar/udf_test.jar;

c)創(chuàng)建臨時(shí)函數(shù):hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

d)查詢HQL語(yǔ)句:

SELECT add_example(8, 9) FROM scores;

SELECT add_example(scores.math, scores.art) FROM scores;

SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)銷毀臨時(shí)函數(shù):hive> DROP TEMPORARY FUNCTION add_example;

UDAF 自定義集函數(shù)

多行進(jìn)一行出,如sum()、min(),用在group by時(shí)

1.必須繼承

} org.apache.hadoop.hive.ql.exec.UDAF(函數(shù)類繼承)

} org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內(nèi)部類Evaluator實(shí)現(xiàn)UDAFEvaluator接口)

2.Evaluator需要實(shí)現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個(gè)函數(shù)

} init():類似于構(gòu)造函數(shù),用于UDAF的初始化

} iterate():接收傳入的參數(shù),并進(jìn)行內(nèi)部的輪轉(zhuǎn),返回boolean

} terminatePartial():無(wú)參數(shù),其為iterate函數(shù)輪轉(zhuǎn)結(jié)束后,返回輪轉(zhuǎn)數(shù)據(jù), 類似于hadoop的Combiner

} merge():接收terminatePartial的返回結(jié)果,進(jìn)行數(shù)據(jù)merge操作,其返回類型為boolean

} terminate():返回最終的聚集函數(shù)結(jié)果

}開(kāi)發(fā)一個(gè)功能同:

}Oracle的wm_concat()函數(shù)

}Mysql的group_concat()

七.Hwi環(huán)境搭建

HWI是Hive Web Interface的簡(jiǎn)稱,是hive cli的一個(gè)web替換方案。

需要下載Hive的源碼文件,然后將hwi/web目錄下的文件用 jar cvf hive-hwi-0.13.1.war ./*

其實(shí)war包也是zip包,可以通過(guò)

cd hwi/web
zip hive-hwi-1.2.1.zip ./*     //打包成.zip文件。

將zip包后綴改成war

mv hive-hwi-1.2.1.zip hive-hwi-1.2.1.war
cp hive-hwi-1.2.1.war /opt/sxt/soft/apache-hive-1.2.1-bin/lib/

命令來(lái)打包成一個(gè)war包,然后放到Hive的lib目錄下即可

配置conf/hive-site.xml

<property>

<name>hive.hwi.war.file</name>

<value>lib/hive-hwi-1.2.1.war</value>

</property>

<property>

<name>hive.hwi.listen.host</name>

<value>0.0.0.0</value>

</property>

<property>

<name>hive.hwi.listen.port</name>

<value>9999</value>

</property>

執(zhí)行命令hive --service hwi

訪問(wèn)http://192.168.17.4:9999/hwi

1.jpg

可參照http://blog.csdn.net/wulantian/article/details/38271803

九.Hive的優(yōu)化

見(jiàn)文檔hive優(yōu)化

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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