Hive的學習和使用

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) 優點

  1. 操作接口採用類SQL語法,提供快速開發的能力(簡單、容易)
  2. 避免寫MapReduce程序,減少開發人員的學習成本
  3. Hive優勢在於處理大數據,常用於數據分析,適用於實時性要求不高的場景
  4. hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數

(2) 缺點

  1. Hive執行延遲比較高,對於處理小數據沒有優勢
  2. hive的HQL表達能力有限(迭代式算法無法表達;數據挖掘方面不擅長,由於MapReduce數據處理流程的限制,效率更高的算法卻無法實現)
  3. 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下載

apache-hive-1.2.1-bin.tar.gz

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數據庫來替換

CentOS 7離線安裝MySQL 5.6

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
  • 案例
  1. 創建數據文件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
  1. 創建表結構文件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';
  1. 上傳數據文件test.txt
hdfs dfs -put test.txt /user/hive/warehouse/test.db/test
  1. 測試查詢
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操作。

  • 隱式類型轉換規則如下
  1. 任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。
  2. 所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。
  3. TINYINT、SMALLINT、INT都可以轉換爲FLOAT。
  4. BOOLEAN類型不可以轉換爲任何其它的類型。
  • 可以使用CAST操作顯示進行數據類型轉換
    例如CAST(‘1’ AS INT)將把字符串’1’ 轉換成整數1;如果強制類型轉換失敗,如執行CAST(‘X’ AS INT),表達式返回空值 NULL。
select '1'+2, cast('1'as int) + 2;

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