Hive的學習和使用
本文是基於CentOS 7.3系統環境,進行hive的學習和使用
- CentOS 7.3
一、Hive的簡介
1.1 Hive基本概念
(1) 什麼是hive
Hive是用於解決海量結構化日誌的數據統計工具,是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張表,並提供類SQL查詢功能
(2) Hive的本質
Hive的本質就是將HQL轉化成MapReduce程序
1.2 Hive優缺點
(1) 優點
- 操作接口採用類SQL語法,提供快速開發的能力(簡單、容易)
- 避免寫MapReduce程序,減少開發人員的學習成本
- Hive優勢在於處理大數據,常用於數據分析,適用於實時性要求不高的場景
- hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數
(2) 缺點
- Hive執行延遲比較高,對於處理小數據沒有優勢
- hive的HQL表達能力有限(迭代式算法無法表達;數據挖掘方面不擅長,由於MapReduce數據處理流程的限制,效率更高的算法卻無法實現)
- hive的效率比較低(hive自動生成的MapReduce作業,通常情況下不夠智能化;hive調優比較困難,粒度較粗)
1.3 Hive架構
- Client 用戶接口
CLI(command-line interface)、JDBC/ODBC(jdbc訪問hive)、WEBUI(瀏覽器訪問hive) - Metastore
元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore - SQL Parser 解析器
對SQL語句進行解析,轉換成抽象語法樹AST,並進行語法分析和檢查 - Physical Plan 編譯器
將抽象語法樹AST編譯成邏輯執行計劃 - Query Optimizer 優化器
對邏輯執行計劃進行優化 - Execution 執行器
將邏輯執行計劃轉換成可以運行的物理計劃,也就是MR任務
1.4 Hive工作機制
Hive通過給用戶提供的一系列交互接口,接收到用戶的指令(SQL),使用自己的Driver,結合元數據(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最後,將執行返回的結果輸出到用戶交互接口。
1.5 Hive和數據庫比較
由於 Hive 採用了類似SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和數據庫的差異。數據庫可以用在 Online 的應用中,但是Hive 是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。
- 查詢語言
由於SQL被廣泛的應用在數據倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。 - 數據存儲位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。 - 數據更新
由於Hive是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive中不建議對數據的改寫,所有的數據都是在加載的時候確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加數據,使用 UPDATE … SET修改數據。 - 執行
Hive中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的。而數據庫通常有自己的執行引擎。 - 執行延遲
Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce框架。由於MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive的並行計算顯然能體現出優勢。 - 可擴展性
由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的(世界上最大的Hadoop 集羣在 Yahoo!,2009年的規模在4000 臺節點左右)。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫 Oracle 在理論上的擴展能力也只有100臺左右。 - 數據規模
由於Hive建立在集羣上並可以利用MapReduce進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。
二、Hive的安裝
2.1 Hive下載
2.2 Hive解壓
tar -xzvf apache-hive-1.2.1-bin.tar.gz -C /opt/module
cd /opt/module
mv apache-hive-1.2.1-bin hive
2.3 配置環境變量
vi /etc/profile
# 添加如下內容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
2.4 修改hive配置文件
cd /opt/module/hive/conf
cp hive-env.sh.template hive-env.sh
vi hive-env.sh
# 添加如下內容
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/opt/module/hadoop-2.7.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/module/hive/conf
2.5 啓動並測試hive
hive
# 創建數據庫
create database test;
# 創建數據表
create table student(id int, name string);
# 插入數據
insert into table student values(1001, "zhangsan");
# 查詢數據
select * from student;
# 刪除數據表
drop table student;
# 刪除數據庫
drop database test;
2.6 hive的bug
hive默認存儲元數據的數據庫爲derby,不支持併發訪問,多開幾個hive客戶端會出現異常
2.7 MySQL的安裝
hive默認存儲元數據的數據庫爲derby,不支持併發訪問,多開幾個hive客戶端會出現異常,因此需要安裝MySQL數據庫來替換
2.8 Hive配置MySQL
cd /opt/module/hive/conf
vi 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:mysql://192.168.1.101:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>
2.9 啓動Hive
hive
三、Hive的使用
3.1 Hive的交互命令
- 運行來自命令行的SQL
cd /opt/module/hive
bin/hive -e "select * from test.student;"
bin/hive -e "select * from test.student;">result.log
- 運行來自文件的SQL
cd /opt/module/hive
vi test.sql
# 添加如下內容
select * from test.student;
# 執行下面命令
bin/hive -f test.sql>result.log
- 退出hive客戶端
quit;
3.2 Hive數據倉庫位置配置
cd /opt/module/hive/conf
vi hive-site.xml
# 添加如下內容
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
3.3 查詢後信息顯示配置
cd /opt/module/hive/conf
vi hive-site.xml
# 添加如下內容
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
3.4 Hive運行日誌信息配置
cd /opt/module/hive/conf
cp hive-log4j.properties.template hive-log4j.properties
vi hive-log4j.properties
# 添加如下內容
hive.log.dir=/opt/module/hive/logs
四、Hive的數據類型
4.1 Hive基本數據類型
hive數據類型 | java數據類型 | 長度 | 示例 |
---|---|---|---|
tinyint | byte | 1byte有符號整數 | 20 |
smalint | short | 2byte有符號整數 | 20 |
int | int | 4byte有符號整數 | 20 |
bigint | long | 8byte有符號整數 | 20 |
boolean | boolean | 布爾類型,true或者false | TRUE FALSE |
float | float | 單精度浮點數 | 3.14159 |
double | double | 雙精度浮點數 | 3.14159 |
string | string | 字符系列,可以使用單引號或者雙引號 | ‘now is’ “i am a” |
timestamp | 時間類型 | ||
binary | 字節數組 |
4.2 Hive集合數據類型
數據類型 | 描述 | 語法示例 |
---|---|---|
struct | 和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那麼第1個元素可以通過字段.first來引用。 | struct() 例如struct<street:string, city:string> |
map | MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼可以通過字段名[‘last’]獲取最後一個元素 | map() 例如map<string, int> |
array | 數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼第2個元素可以通過數組名[1]進行引用。 | Array() 例如array |
- 案例
- 創建數據文件test.txt
vi test.txt
# 添加如下內容
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
- 創建表結構文件test.sql
vi test.sql
# 添加如下內容
create table test.test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
- 上傳數據文件test.txt
hdfs dfs -put test.txt /user/hive/warehouse/test.db/test
- 測試查詢
hive
use test;
select name,friends[1],children["xiao song"],address.city from test;
4.3 類型轉化
Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST操作。
- 隱式類型轉換規則如下
- 任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。
- 所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。
- TINYINT、SMALLINT、INT都可以轉換爲FLOAT。
- BOOLEAN類型不可以轉換爲任何其它的類型。
- 可以使用CAST操作顯示進行數據類型轉換
例如CAST(‘1’ AS INT)將把字符串’1’ 轉換成整數1;如果強制類型轉換失敗,如執行CAST(‘X’ AS INT),表達式返回空值 NULL。
select '1'+2, cast('1'as int) + 2;