Hive體系介紹
★ Hive簡介
Hive是架構在Hadoop上的數據倉庫架構。它提供了一系列的工具,可以用這些工具來進行ETL,即數據的提取轉化加載。這是一種可以存儲、查詢和分析存儲在Hadoop中HDFS中的大規模數據的機制。
Hive定義了簡單的類SQL語言,稱爲QL,也被稱爲HQL.
Hive的工作原理就是將SQL語句默誦成MR Job然後在Hadoop上運行。
Hive的表就是HDFS的目錄,表名就是用一個個的文件來區分的。如果是分區表,則分區值是文件夾的子文件夾,可以直接將在MR Job裏使用這些數據。
★ Hive的架構
下圖是一個典型的Hive的架構圖。
1:Hive的用戶接口包括:CLI(即shell命令行)、JDBC/ODBC(Hive的Java)、和WebUI
2:Hive元數據的存儲,通常是存儲在關係型數據庫中,如Mysql或Derby
Hive中的元數據包括有表的名字、表的列和分區及其屬性,表的屬性(外部表or內部表),表的數據所在的目錄
3:Hive自己有解釋器、編譯器、優化器和執行器
Hive的解釋器、編譯器、優化器完成的任務:把HQL查詢語句從詞法分析、語法分析、編譯、優化及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後的MapReduce中調用。
4:Hadoop利用HDFS進行數據存儲,利用MapReduce來計算
5:Hive的數據存儲在HDFS中,大部分的查詢由MapReduce完成。包含*的查詢不會轉化爲MapReduce任務。
▲ 什麼是ETL?
ETL,是英文 Extract-Transform-Load 的縮寫,用來描述將數據從來源端經過萃取(extract)、轉置(transform)、加載(load)至目的端的過程。[摘自百度百科]
★ Hive的安裝
一、安裝步驟
1:上傳文件、解壓、重命名略
2:配置環境變量
export HIVE_HOME=/usr/local/hive
export PATH=.:$PATH:$HIVE_HOME/bin
source /etc/profile
3:修改Hive的配置文件的名稱
原配置文件名稱:
hive-default.xml.template
hive-exec-log4j.properties.template
hive-env.sh.template
hive-log4j.properties.template
修改:
mv hive-default.xml.template hive-site.xml
mv hive-env.sh.template hive-env.sh
修改後配置文件名稱:
hive-env.sh
hive-site.xml
4:修改$HADOOP_HOME/conf/hadoop-env.sh
export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin
5:修改$HIVE_HOME/bin/hive-config.sh
export JAVA_HOME=/usr/local/jdk1.6
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop1
6:修改hive保存metadata的數據關係型數據庫
默認Hive保存Metadata的關係型數據庫是內嵌的Derby數據庫。
Metadata是HiveHive元數據的集中存放地。
由於Derby一次只能打開一個會話,由於存在這個缺點,故要修改Hive保存Metadata的數據庫。
修改$HIVE_HOME/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop5: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>root</value>
</property>
7:啓動Hive
執行$HIVE_HOME/bin/hive進入cli命令行交互模式
啓動Hive並查看所有的數據庫。還可以查看錶,語法類似Mysql。
根據配置:jdbc:mysql://hadoop5:3306/hive?createDatabaseIfNotExist=true
在Mysql數據庫中會有一個叫做hive的數據庫,如下圖所示:如下是Hive在Mysql中的數據庫及表。
設置Hive數據庫文件夾及文件在HDFS中的保存目錄。
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hivemetastore</value>
<description>location of default database for thewarehouse</description>
</property>
二、運行模式
Hive的運行模式即任務的執行環境。
運行模式包括本地和集羣兩種,可以通過mapred.job.tracker來指明。
設置:
hive>SET mapred.job.tracker=local
三、Hive的啓動方式
㈠、Hive命令行方式
命令:hive --service cli
或者直接輸入#hive
也可以進入命令行交互模式
㈡、hive web 界面(端口號:9999)的啓動方式
#hive--service hwi &
用於通過瀏覽器來訪問hive
在瀏覽器輸入http://hadoop5:9999/hwi/authorize.jsp
即可訪問到如下頁面。
㈢、hive 遠程服務(端口號10000) 啓動方式
#hive --service hiveserver &
#hive --service hiveserver 10000>/dev/null 2>/dev/null &
★ Hive與傳統數據庫
Hive中沒有定義專門的數據格式,數據格式由用戶指定,用戶定義數據格式需要指定三個屬性。分別是:列分隔符、行分隔符以及讀取文件數據的方法(Hive中默認有三個文件格式TextFile、SequenceFile以及RCFile)。由於在加載數據的過程中,不需要用戶數據格式到Hive定義的數據格式的轉換,因此Hive加載過程中不會對數據進行任何修改,而只是將數據內容複製或者移動到相應的HDFS目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有的數據在從外部進入數據庫時,都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時一些。
下表展示Hive與傳統數據庫的區別:
查詢語言 |
HiveQL |
SQL |
數據存儲位置 |
HDFS |
Raw Device or 本地FS |
數據格式 |
用戶定義 |
系統決定 |
數據更新 |
不支持 |
支持 |
索引 |
新版本有,但弱 |
有 |
執行 |
MapReduce |
Executor |
執行延遲 |
高 |
低 |
可擴展性 |
高 |
低 |
數據規模 |
大 |
小 |
★ Hive的數據類型
基本數據類型:
tinyint/smallint/int/bigint
float/double
bolean
strign
複雜數據類型
Array/Map/Struct
Hive的存儲結構主要包括:數據庫、文件、表、視圖
Hive默認可以直接加載文本文件(TextFile),還支持sequencefile,創建表時,指定Hive數據的列分隔符,Hive即可解析數據。
★ Hive的表的數據模型
四種表類型的介紹。
▲ Table 內部表
每一個內部表在Hive中都有一個相應的目錄存儲數據。
例如:一個表test,它在HDFS中的路徑爲/hivemetastore/test
注:其中hivemetastore是在hive.site.xml中${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄。
${hive.metastore.warehouse.dir}是除分區表外所有的表數據保存數據的目錄。
準備數據:
創建表/導入數據/查看導入數據:
查詢數據庫中的記錄數:
查詢記錄數的時候,實際上是走了一個MRJob來計算數據表中記錄的個數。
如下是數據文件在HDFS中的存儲:
▲ Partition 分區表
Partition對應於數據庫的Partition列的密集索引。
在Hive中,表中的一個Partition對應於表下的一個目錄,所有的Partition的數據都存儲在對應的目錄中。
如:表test中包含date和city兩個Partition,
則對應於date=20140725,city=bj的HDFS子目錄爲:/hivemetastore/test/date=20140725/city=bj
對應於date=20140725,city=bj的HDFS子目錄爲:/hivemetastore/test/date=20140725/city=bj
準備數據:(用'\t'來分割)
創建表:
create table partition_table (rectimestring,msisdn string) partitioned by (daytime string,city string) row formatdelimited fields terminated by '\t' stored as TEXTFILE;
加載數據到表:
load data local inpath'/root/partition_table.dat' into table partition_table partition(daytime='2014-07-25',city='bj');
查看數據:
查看分區表的分區信息:
查看錶結構:
如下顯示的是所有的分區在HDFS中的情況:
刪除分區:
刪除分區後:
刪除分區後,元數據、數據文件被刪除,而目錄還存在。如下所示:
▲ External Table 外部表
注:外部表導入時似乎不用把數據傳到HDFS中。只用Linux下的系統文件即可。
外部表:指向在HDFS中已經存在的數據,可以創建Partition
它和內部表在元數據的組織上是一致的,而實際的數據存儲則有較大差異。
內部表的創建過程和數據加載過程,在加載數據的過程中,實際數據會被移動到數據倉庫目錄中。之後對數據的訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。內部表的創建過程和數據加載可以在同一個語句中完成。
外部表只有一個過程,加載數據和創建表同時完成,並不會移動數據到數據倉庫的目錄中,只是與外部數據建立一個鏈接。當刪除一個外部表時,僅僅是刪除該鏈接。
準備數據:
文件路徑:/root/external_table2.dat
創建表:
命令:
create external table external_table (namestring,age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location'/root/external_table2.dat';
導入數據:(如果需要)
LOAD DATA INPATH '/external_table2' INTOTABLE external_table;
此時導入時應該用的是HDFS文件。
查詢某列:
查詢某列時,則會啓動一個MR Job來查詢結果。
▲ Bucket Table 桶表
桶表是對數據進行哈希取值,然後放到不同文件中進行取值。
數據源:
創建桶表:
create table bucket_table(age int,namestring) clustered by(age) into 4 buckets;
設置參數:
hive> set hive.enforce.bucketing = true;
插入數據:
導入數據後查看數據:
★ Hive的shell操作
包括對數據庫的各種操作。
▲ 創建一個數據庫
命令:create database test_hive;
▲ 使用數據庫
命令:use test_hive;
▲ 基於Partition的查詢
表中所有數據:
表結構:
按分區查詢:
▲ Limit 查詢
▲ TOP N查詢
select partition_table.* from partition_tablesort by rectime asc;
再結合limit
select partition_table.* frompartition_table sort by rectime asc limit 5;
▲ 表連接
導入ac信息表
hive> create table acinfo (namestring,acip string) row format delimitedfields terminated by '\t' stored as TEXTFILE;
hive> load data local inpath'/home/acinfo/ac.dat' into table acinfo;
內連接
select b.name,a.* from dim_ac a join acinfob on (a.ac=b.acip) limit 10;
左外連接
select b.name,a.* from dim_ac a left outerjoin acinfo b on a.ac=b.acip limit 10;
▲ 創建一個數據庫
▲ 創建一個數據庫
▲ 創建一個數據庫
▲ 創建一個數據庫
▲ 創建一個數據庫
★ Java客戶端
第一:啓動Hive遠程服務
#hive --service hiveserver >/dev/null 2>/dev/null &
JAVA客戶端相關代碼
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con =DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw","", "");
Statement stmt = con.createStatement();
String querySQL="SELECT * FROMwlan_dw.dim_m order by flux desc limit 10";
ResultSet res =stmt.executeQuery(querySQL);
while (res.next()) {
System.out.println(res.getString(1)+"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t"+res.getLong(4)+"\t" +res.getLong(5));
}
★ UDF函數
★ UDAF函數
★ Mysql安裝
在設置Hive保存元數據之前,應該安裝Mysql數據庫,並設置相應的用戶密碼。
卸載Mysql 5.1.66
rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 --nodeps
rpm -e mysql-5.1.66-2.el6_3.x86_64 --nodeps
rpm -e mysql-server-5.1.66-2.el6_3.x86_64 --nodeps
rpm -e mysql-connector-odbc-5.1.5r1144-7.el6.x86_64
安裝Mysql 5.1.66
rpm -ivh mysql-5.1.66-2.el6_3.x86_64.rpm --force--nodeps
rpm -ivhmysql-libs-5.1.66-2.el6_3.x86_64.rpm --force --nodeps
rpm -ivhmysql-server-5.1.66-2.el6_3.x86_64.rpm --force --nodeps
rpm -ivh mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm--force --nodeps
安裝MySQL-server-5.5.31-2.el6.i686.rpm
報錯!有時間再安裝下