Hive從概念到安裝使用總結

2016-01-12    分類:資料庫、程式設計開發、首頁精華1人評論發表於2016-01-12

本文由碼農網 – 朱鵬飛原創,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

一、Hive的基本概念

1.1 hive是什麼?

(1)Hive是建立在hadoop資料倉儲基礎之上的一個基礎架構;

(2)相當於hadoop之上的一個客戶端,可以用來儲存、查詢和分析儲存在hadoop中的資料;

(3)是一種SQL解析引擎,能夠將SQL轉換成Map/Reduce中的Job在hadoop上執行。

1.2 hive的資料儲存特點

(1)資料儲存是基於hadoop的HDFS;

(2)沒有專門的資料儲存格式;

(3)儲存結構主要有:資料庫、檔案(預設可以直接載入文字檔案)、表、檢視、索引;

說明:hive中的表實質就是HDFS的目錄,按表名將資料夾分開,若是分割槽表,則分割槽值是子資料夾。這些資料可以直接在M/R中使用。hive中的資料是存放在HDFS中的。

二、hive的系統結構

儲存hive的後設資料(表及表的屬性、資料庫名字等)

分析執行hive QL語句,將執行計劃投遞給hadoop,轉到map/reduce執行

2.1 hive的系統結構– metastore儲存方式

預設情況,後設資料使用內嵌的derby資料庫作為儲存引擎

將儲存資料獨立出來,支援多使用者同時訪問

將metastore獨立出來,遠端方法呼叫

三、hive的安裝與使用

3.1下載hive原始檔,解壓hive檔案

進入$HIVE_HOME/conf/修改檔案

cp  hive-default.xml.template  hive-site.xml
cp  hive-env.sh.template hive-env.sh

修改$HIVE_HOME/bin的hive-env.sh,增加以下三行

HADOOP_HOME=    --hadoop的home目錄
export HIVE_CONF_DIR=   --hive的conf目錄
export HIVE_AUX_JARS_PATH=   --hive的lib目錄

生效檔案:

source /hive-env.sh(生效檔案)

3.2 配置MySQL的metastore

修改$HIVE_HOME/conf/hive-site.xml

<property>

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

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

3.3hive臨時目錄的配置

修改$HIVE_HOME/conf/hive-site.xml

(1)設定資料目錄

<property>

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

<value>/usr/local/hive/warehouse</value>

</property>

(2)設定臨時檔案目錄

<property>

<name>hive.exec.scratdir</name>

<value>/usr/local/hive/tmp</value>

</property>

(3)hive相關日誌的目錄

<property>

<name>hive.querylog.location</name>

<value>/usr/local/hive/log</value>

</property>

3.4hive的執行模式的指定

Hive的執行模式即任務的執行環境,分為本地與叢集兩種,我們可以通過mapred.job.tracker 來指明

本地模式設定方式:

hive > set mapred.job.tracker=local;
hive > set hive.exec.mode.local.auto=true;
hive.exec.mode.local.auto.inputbytes.max預設128M

3.5 sqoop的安裝

(1)下載、解壓:

tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz /root
cd /root
ln -s sqoop-1.4.3.bin sqoop

(2)配置sqoop:

vi ~/.bash_profile
export SQOOP_HOME=/usr/local/sqoop
export PATH=$SQOOP_HOME/bin:$PATH

(3)測試連線資料庫並列出資料庫:

sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456

(4)將mysql中的表匯入到hive中:

sqoop import --connect jdbc:mysql://localhost:3306/gwifi --username root --password 123456 --table think_access --hive-import -m 1;

3.6 hive的命令列方式

1、輸入#/hive/bin/hive執行應用程式, 或者

#hive
hive> create table test(id int, name string);
hive> show tables;
hive>quit;

檢視並修改表與目錄之間的關係

#hadoop fs -ls /user/hive/warehouse/

修改引數:hive.metastore.warehouse.dir 表與目錄的對應關係

3.6 命令列方式

顯示或修改引數值

在程式碼中可以使用${…}來使用

名稱空間 使用許可權 描述
hivevar 可讀寫 $ hive -d name=zhangsan;
hiveconf 可讀寫 $ hive –hiveconf hive.cli.print.current.db=true;$ hive –hiveconf hive.cli.print.header=true;
system 可讀寫 java定義的配置屬性,如system:user.name
env 只讀 shell環境變數,如env:USER

3.7 hive的指令碼執行

$>hive -i /home/my/hive-init.sql
$hive>source file

與linux互動命令 !

!ls
!pwd

與hdfs互動命令

dfs -ls /
dfs -mkdir /hive

3.8 hive的jdbc模式

JAVA API互動執行方式

hive 遠端服務 (埠號10000) 啟動方式

3.9 hive常用的命令– set命令

hive控制檯set命令:

set hive.cli.print.current.db=true;
set hive.metastore.warehouse.dir=/hive

hive引數初始化配置set命令:

~/.hiverc

四、HiveQL資料操作

4.1資料型別

1、基本資料型別:與mysql等資料庫中基本資料型別類似;

2、複合資料型別:

(1)array 陣列型別 如:array[int] 下標訪問

(2)struct結構型別 如: struct{name:STRING,age:INT} .訪問

(3)Map結構

4.2 資料庫/表的定義、操作

預設使用的是“default”資料庫,使用命令選擇資料庫:

hive> use <資料庫名>

建立資料庫: create database <資料庫名>

檢視所有資料庫: show databases;

檢視/刪除資料庫:desc/drop database <資料庫名>;

注:Hive沒有 行級別的插入,更新和刪除操作,往表中插入資料的唯一方法就是使用成批載入操作

hive>create table 表名(欄位名 欄位型別,……)

hive>show tables;

hive>create table t2 like t1;

hive> drop table 表名    —刪除表

增加列

hive>ALTER TABLE t3 ADD COLUMNS(gender int);

在mysql中hive資料庫中show tables; 在TBLS表中可以檢視到hie建立的表。

4.3 資料庫/表的定義、操作

插入資料:insert overwrite table t_table1 select * from t_table1 where XXXX;

刪除資料:insert overwrite table test select * from test where 1=0;

陣列型別的表的操作:

定義複合資料型別的表:create table demo_array(id int, mydata array[string])  PARTITIONED BY (dt STRING)  row format delimited fields terminated by ’\t’ collection items terminated by ’|';

–id 與mydata之間是’\t’隔開,其後的mydata資料之間用’|'隔開

4.3.1 Hive的資料模型-管理表

管理表,也稱作內部表或受控表

特點:(1)資料全部儲存在warehouse目錄中;

(2)刪除表時後設資料和表中的資料都會被刪除;

(3)建立表和資料載入可以在同一條語句中實現;

(4)每個表在HDFS中都有相應的目錄用來儲存表的資料

(5)載入資料的過程,實際資料會被移動到資料倉儲目錄中;對資料的訪問是在資料倉儲目錄中完成。

4.3.1 Hive的資料模型-管理表

建立資料檔案inner_table.dat

建立表

hive>create table inner_table (key string)
row format delimited fields terminated by '\t';
//這個要指定,否則load的時候資料為NULL;

載入資料

hive>load data local inpath '/root/inner_table.dat' into table inner_table;

檢視資料

select * from inner_table

select count(*) from inner_table

刪除表 drop table inner_table

4.3.2 Hive的資料模型-外部表

包含externable的表叫做外部表

特點:(1)刪除外部表只刪除metastore的後設資料,不刪除hdfs中的表資料;

(2)載入資料和建立表是同時完成的,並不會移動到資料,只是與外部資料建立一個連結;刪除一個外部表,只是刪除了該連結

(3)指向已經在 HDFS 中存在的資料

4.3.2 Hive的資料模型-外部表語法

CREATE EXTERNAL TABLE page_view

( viewTime INT,

userid BIGINT,

page_url STRING,

referrer_url STRING,

ip STRING COMMENT 'IP Address of the User',

country STRING COMMENT 'country of origination‘

)

COMMENT 'This is the staging page view table'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '44'  LINES  TERMINATED BY '12'

STORED AS TEXTFILE

LOCATION 'hdfs://centos:9000/user/data/staging/page_view';

4.3.3 Hive的資料模型-分割槽表

分割槽可以理解為分類,通過分類把不同型別的資料放到不同的目錄下;

分類的標準就是分割槽欄位,可以一個,也可以多個;

分割槽表的意義在於優化查詢,查詢時儘量利用分割槽欄位;如果不使用分割槽欄位,就會全部掃描。

建立資料檔案partition_table.dat

建立表

create table partition_table(rectime string,msisdn string) partitioned by(daytime string,city string) row format delimited fields terminated by '\t' stored as TEXTFILE;

載入資料到分割槽

load data local inpath '/home/partition_table.dat' into table partition_table partition (daytime='2013-02-01',city='bj');

檢視資料

select * from partition_table

select count(*) from partition_table

刪除表 drop table partition_table

4.3.4 Hive的資料模型-分割槽表

CREATE TABLE tmp_table #表名

(

title   string, # 欄位名稱 欄位型別

minimum_bid     double,

quantity        bigint,

have_invoice    bigint

)COMMENT '註釋:XXX' #表註釋

PARTITIONED BY(pt STRING) #分割槽表欄位(如果你檔案非常之大的話,採用分割槽表可以快過濾出按分割槽欄位劃分的資料)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'   # 欄位是用什麼分割開的

STORED AS SEQUENCEFILE; #用哪種方式儲存資料,SEQUENCEFILE是hadoop自帶的檔案壓縮格式

4.4.1 裝載資料

從檔案中裝載資料

hive>LOAD DATA [LOCAL] INPATH '...' [OVERWRITE] INTO TABLE t2 [PARTITION (province='beijing')];

通過查詢表重新裝載資料

hive>INSERT OVERWRITE TABLE t2 PARTITION (province='beijing') SELECT * FROM xxx WHERE xx

設定job並行數量 hive.exec.parallel =true;

hive.exec.parallel. thread.number =3;

4.4.2 動態分割槽裝載資料

開啟動態分割槽支援

hive>set hive.exec.dynamic.partition=true;

hive>set hive.exec.dynamic.partition.mode=nostrict;

hive>set hive.exec.max.dynamic.partitions.pernode=1000;

#查詢欄位一樣

hive>INSERT OVERWRITE TABLE t3 PARTITION(province, city)

SELECT t.province, t.city FROM temp t;

hive>INSERT OVERWRITE TABLE t3 PARTITION(province='bj', city)

SELECT t.province, t.city FROM temp t WHERE t.province='bj';

單語句建表並同時裝載資料

hive>CREATE TABLE t4 AS SELECT ....

select count(0) from (select id from test where name like 'zh%') a join (select id from test where name like '%i%') b on a.id = b.id;

五、hive的儲存形式比較

hive在建表時,可以通過‘STORED AS FILE_FORMAT’ 指定儲存檔案格式。有以下幾種:

1.TextFile:儲存空間較大,壓縮之後的檔案不能分割與合併,查詢效率低;可直接儲存,載入速度最快;

2.sequencefile:hadoop API提供的一種二進位制檔案支援,儲存空間最大,可分割與合併,查詢效率高,需要text檔案轉換來載入

3.RcFile:是一種行列儲存相結合的儲存方式。(1)將資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block;(2)塊資料列式儲存,有利於資料壓縮和快速的列存取。查詢效率最高、儲存空間最小、但載入最慢

總結

本文連結:http://www.codeceo.com/article/hive-usage.html
本文作者:碼農網 – 朱鵬飛
原創作品,轉載必須在正文中標註並保留原文連結和作者等資訊。]

相關文章