一、 基礎知識
1.1 數據倉庫基本模型:星型模型(面向主題)、雪花模型
Hive數據倉庫:是建立在Hadoop HDFS上的數據倉庫基礎框架,ELT,HQL
Hive的體系結構:hive將元數據存儲在數據庫中,用 HDFS存儲數據,用MapReduce進行計算。
HQL執行過程:解析器、編譯器、優化器
1.2 Hive架構與基本組成:
基本組成
•用戶接口,包括 CLI,JDBC/ODBC,WebUI
•元數據存儲,通常是存儲在關係數據庫如 mysql, derby 中
•解釋器、編譯器、優化器、執行器
•Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算
由上圖可知,hadoop和mapreduce是hive架構的根基。Hive架構包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),這些組件我可以分爲兩大類:服務端組件和客戶端組件。
首先講講服務端組件:
Driver組件:該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後調用底層的mapreduce計算框架。
Metastore組件:元數據服務組件,這個組件存儲hive的元數據,hive的元數據存儲在關係數據 庫裏,hive支持的關係數據庫有derby、mysql。元數據對於hive十分重要,因此hive支持把metastore服務獨立出來,安裝到遠程的服務器集羣裏,從而解耦hive服務和metastore服務,保證hive運行的健壯性,這個方面的知識,我會在後面的metastore小節裏做詳細的講解。
Thrift服務:thrift是facebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的接口。
客戶端組件:
CLI:command line interface,命令行接口。
Thrift客戶端:上面的架構圖裏沒有寫上Thrift客戶端,但是hive架構的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。
WEBGUI:hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個接口對應hive的hwi組件(hive webinterface),使用前要啓動hwi服務。
1.3 HiveUI介紹
啓動UI
•配置
•hive-site.xml 添加
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-0.8.1.war</value>
•啓動Hive的UI sh $HIVE_HOME/bin/hive –service hwi
二、 HIVE的安裝
下載路徑:hive.apache.org
三、 常用的CLI命令
1、清屏:ctl+L或者!clear回車後加;
2、查看錶的信息:show tables;
3、查看數據倉庫中內置的函數:show functions;
4、查看錶結構:desc表名;
5、刪除表:drop table if exists 表名;
6、查看HDFS上的文件:dfs -ls 目錄;
dfs -lsr 目錄;(遞歸的方式查看)
7、執行操作系統的命令:!命令;
8、靜默模式:hive –s;
9、操作系統中直接輸:hive –e ‘show tables’;可直接執行
10、自動補全:如select,只要輸入sel,然後按下tab鍵就可以自動補全命令。
11、查看當前工作目錄:hive> ! pwd;
12、列舉所有以字母h開頭,以其他字符結尾的數據庫名:hive>showdatabases like ‘h.*’;
13、將數據庫設置爲當前的工作數據庫,和在文件系統中切換工作目錄是一個概念:use 數據庫名;
14、刪除數據庫並刪除數據庫中的表,要在刪除命令最後加關鍵字cascade,這樣可以使hive自行先刪除數據庫中的表:drop database if exists employee cascade;
15、查看錶的詳細表結構信息:describe extended employee;
16、查看錶更多更詳細的信息;describe formatted employee;
17、只看某一列:describe extended employee.name;
18、查看某個表信息:hive> ! cat employee.txt;
在Silent模式下將數據轉儲到指定的文件中並查詢:
[hadoop@hadoop~]$ hive -S -e ‘show tables’ > a.txt
[hadoop@hadoop~]$ cat a.txt
19、查看所建數據表信息:hive> dfs -ls /user/hive/warehouse;
20、Linux下如何用命令查看當前目錄下所有文件的大小,以行數和字節爲單位:ls -l /ls -al或者像樓上說的直接 ll
21、linux下查找某個文件位置的方法:
[hadoop@master~]$ find -name user_infor.txt;
./user_infor.txt
或者是:[hadoop@master ~]$ locateuser_infor.txt;
/home/hadoop/user_infor.txt
四、 Hive基本命令整理
4.1 創建表:
1、創建表
hive> CREATE TABLE pokes (fooINT, bar STRING)
//Creates a table called pokeswith two columns, the first being an integer and the other a string
2、創建一個新表,結構與其他一樣
hive> create table new_tablelike records;
3、創建分區表:
hive> create table logs(tsbigint,line string) partitioned by (dt String,country String);
4、加載分區表數據:
hive> load data local inpath’/home/hadoop/input/hive/partitions/file1’ into table logs partition(dt=’2001-01-01’,country=’GB’);
5、展示表中有多少分區:
hive> show partitions logs;
6、展示所有表:
hive> SHOW TABLES;
//lists all the tables
hive> SHOW TABLES ‘.*s’;
//lists all the table that endwith ‘s’. The pattern matching follows Java regular expressions.
7、顯示錶的結構信息
hive> DESCRIBE invites;
//shows the list of columns
8、更新表的名稱:
hive> ALTER TABLE sourceRENAME TO target;
9、添加新一列:
hive> ALTER TABLE invites ADDCOLUMNS (new_col2 INT COMMENT ‘a comment’);
10、刪除表:
hive> DROP TABLE records;
刪除表中數據,但要保持表的結構定義
hive> dfs -rmr /user/hive/warehouse/records;
11、從本地文件加載數據:
hive> LOAD DATA LOCAL INPATH’/home/hadoop/input/ncdc/micro-tab/sample.txt’ OVERWRITE INTO TABLE records;
12、顯示所有函數:
hive> show functions;
13、查看函數用法:
hive> describe function substr;
14、查看數組、map、結構
hive> selectcol1[0],col2[‘b’],col3.c from complex;
15、內連接:
hive> SELECT sales.,things. FROM sales JOIN things ON (sales.id = things.id);
16、查看hive爲某個查詢使用多少個MapReduce作業
hive> Explain SELECT sales.,things. FROM sales JOIN things ON (sales.id = things.id);
17、外連接:
hive> SELECT sales.,things. FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales., things. FROM sales RIGHTOUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales., things. FROM salesFULL OUTER JOIN things ON (sales.id = things.id);
in查詢:Hive不支持,但可以使用LEFT SEMI JOIN
hive> SELECT * FROM thingsLEFT SEMI JOIN sales ON (sales.id = things.id);
18、創建視圖:
hive> CREATE VIEWvalid_records AS SELECT * FROM records2 WHERE temperature !=9999;
19、查看視圖詳細信息:
hive> DESCRIBE EXTENDEDvalid_records;
五、 Hive中數據的導入
Hive的幾種常見的數據導入方式
這裏介紹四種:
- 從本地文件系統中導入數據到Hive表;
a) 從外部將數據導入到本地文件中,如:將employee.txt導入到/home/hadoop文件夾下。
b) 在hive中創建表。
hive> create table table_employee
> (namestring,id int,address string)
> rowformat delimited
>fields terminated by '\t'
stored as textfile;
c) 將本地文件導入到表中
hive> load data local inpath ‘employee.txt’ into tabletable_employee;
若顯示路徑無效,則找到’employee.txt’的路徑,方法:
[hadoop@master~]$ find -name employee.txt;
./user_infor.txt
找到路徑後再重新導入:hive> load data local inpath ‘./employee.txt’into table table_employee;
d) 在表的目錄下查看
hadoopdfs –ls;
e) 進行檢驗,如表的查詢
select *from table_employee;
從HDFS上導入數據到Hive表;
從別的表中查詢出相應的數據並導入到Hive表中;
在創建表的時候通從別的表中查詢出相應的記錄並插入到所創建的表中。
六、 分區分桶
hive引入partition和bucket的概念,這兩個概念都是把數據劃分成塊,分區是粗粒度的劃分桶是細粒度的劃分,這樣做爲了可以讓查詢發生在小範圍的數據上以提高效率。
如表:
lyw 1 shanghai
ls 2 wuhan
hj 3 hangzhou
yj 4 wuhan
jg 5 nignbo
wyy 6 shenzhen
- 分區
a) hive中創建分區表沒有什麼複雜的分區類型(範圍分區、列表分區、hash分區、混合分區等)。分區列也不是表中的一個實際的字段,而是一個或者多個僞列。意思是說在表的數據文件中實際上並不保存分區列的信息與數據。下面的語句創建了一個簡單的分區表:
hive> create table table_friends
> (namestring,id int)partitioned by(year int)
> row formatdelimited
> fieldsterminated by ' ' (字段分隔符)
> stored astextfile; (作爲文本存儲)
b) 描述分區表(describeextended )
describe extended table_friends;
c) 導入分區和數據
將數據導入,先創建好分區才能導入數據。這個例子中創建了year作爲分區列,通常情況下需要先預先創建好分區,然後才能使用該分區。
hive> load datainpath
into table table_friends
partition(year=2015);
對於小數據量導入,可採取下面的語句來實現
insert intovalues()等價實現insert into table select …from limit 1;
- 分桶
分桶的目的:第一,獲得更高的查詢處理效率,桶爲表加上了額外的結構,第二,取樣更高效。
桶是更爲細粒度的數據範圍劃分,它能使一些特定的查詢效率更高,比如對於具有相同的桶劃分並且jion的列剛好就是在桶裏的連接查詢,還有就是示例數據,對於一個龐大的數據集我們經常需要拿出來一小部分作爲樣例,然後在樣例上驗證我們的查詢,優化我們的程序。
物理上,每個桶就是表目錄裏的一個文件。
創建帶桶的表:
hive> create table bucket_employee(
> name string,
> id int,
> address string,
> date int) clusteredby (address) into 4 buckets;
導入數據到桶中:
hive> set hive.enforce.bucketing=true; //指令讓Inceptor自動根據表的分桶填入數據,寫入時,Inceptor會盡量均勻地將數據哈希進各個桶中。
hive> insert overwrite table bucket_employee
> select * fromemployee;
下面來看看利用bucket來對示例數據進行查詢
—帶桶的表
select * from bucketed_users
tablesample(bucket 1 out of 4 on id);
—不帶桶的表
select * from users
tablesample(bucket 1 out of 4 on rand());
tablesample的作用就是讓查詢發生在一部分桶上而不是整個數據集上,上面就是查詢4個桶裏面第一個桶的數據,相對與不帶桶的表這無疑是效率很高的,因爲同樣都是需要一小部分數據,但是不帶桶的表需要使用rand()函數,需要在整個數據集上檢索。
存儲格式查詢
describe formatted bucket_employee;
七、 Hive的元數據存儲
存儲方式與模式
Hive 將元數據存儲在數據庫中
連接到數據庫模式有三種
單用戶模式
多用戶模式
遠程服務器模式
八、 遇到的問題及解決方法
(一) 10.1.30.2上的mysql是mysql -u root -p123456
[hadoop@master ~]$ mysql -u root -p123456
回滾出錯修改方法。
若要showtables;
先要showdatabases;
選擇數據庫 use 數據庫名;
(二) 進入sqoop
(三)自己建的文件:
[root@transwarp1 ~]# su hdfs
bash-4.1$ hdfs dfs –ls
bash-4.1$ hdfs dfs -ls /
bash-4.1$ hdfs dfs -ls /user
hdfs dfs -ls /user/outputHive
(四)進入環境10.1.65.10