Hive體系介紹

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

 

報錯!有時間再安裝下

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章