1 Hive
Hadoop在海量離線資料分析時遇到的問題:
開發除錯一個複雜的MR程式,不適合要求快速得出結果的業務場景。
Hadoop是由Java開發的,MR天生對java支援最好,對其他語言的使用者不太友好。
需要對Hadoop底層具有一定的瞭解,並且要記憶大量的API,才能開發出一個優秀MR。
hive是一個基於hadoop的資料倉儲,使用hiveQL(類sql)來實現分散式離線資料處理。
hive的優點:
1、不需要開發除錯複雜的MR,適用於要求快速出結果的業務場景。
2、類SQL請多對所有的程式設計師都比較友好
3、不需要對hadoop底層有過深的瞭解
4、支援使用java或其他語言處理邏輯封裝成UDF,來豐富函式庫。
資料倉儲的概念:
資料倉儲是一個面向主題的,穩定的,反映歷史資料的資料儲存系統,一般用來為管理者提供決策分析。
資料倉儲和資料庫的區別:
資料表:
內部表:先有表,後有資料。刪除表時,資料清空。
外部表:先有資料,後有表。刪除表時,資料依然保留。
分割槽:
分割槽實現了資料倉儲的面向主題的設計思想。
分桶表:
分桶表是用來測試,用hash模餘的方式實現每桶中的資料都具有一定的代表性。
1.1 概述
Hive是建立在 Hadoop 上的資料倉儲基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,也允許開發者使用java等語言解決複雜邏輯問題,並封裝起來成為一個自定義函式(UDF),載入到hive中,來彌補原函式庫的不足。
1.1.1 資料倉儲
資料倉儲是一個面向主題的,穩定的,反映歷史資料的資料儲存系統,一般用來為管理者提供決策分析。
1.2 Hive的安裝
Hive的安裝非常簡單,上傳,解壓,啟動。前提是,Hadoop要全量啟動。配置JAVA_HOME,HADOOP_HOME。
Hadoop啟動:
Start-all.sh全量啟動hadoop。
如果以上hadoop相關程式不全,先執行stop-all.sh停掉所有服務,然後start-all.sh重新啟動。
Hive的啟動:
進入hive的bin目錄,執行./hive
1.3 基礎操作
1.3.1 建立資料庫
Create database db1;
結論一:hive中的資料庫在HDFS中就是/user/hive/warehouse目錄下的一級以資料庫名+.db命名的資料夾
1.3.2 建立表
create table tb_user (id int,name string) ;
結論二:hive中的表在HDFS中就是在對應資料庫資料夾下的一個資料夾。
1.3.3 插入資料
insert into table tb_user values(1,'dongcc');
結論三:hive在必要時會將HQL翻譯成MR來執行。
結論四:hive中的資料以檔案的形式存放在HDFS中對應表的目錄下。
1.3.4 載入資料
Load data local inpath ‘檔案路徑’ into table tb_user;
1.3.5 建立帶有分隔符的表
create table tb_book (id int ,name string) row format delimited fields terminated by '\t';
1.3.6 Default資料庫
結論五:default資料庫在HDFS中將資料直接存放在/user/hive/warehouse目錄下。
1.3.7 可能遇到的問題
Hive啟動不了
檢查JAVA_HOME和HADOOP_HOME是否配置成功。如果沒有問題並報錯:Cannot find hadoop installation: $HADOOP_HOME or $HADOOP_PREFIX must be set or hadoop must be in the path
解決辦法:
指定HADOOP_HOME路徑
cd /usr/local/src/hive/apache-hive-1.2.0-bin/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
增加HADOOP_HOME
HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1
Hive啟動報錯Safe mode
Hadoop在啟動時有個安全模式,其在啟動時有些工作要做,後設資料的處理,DataNode的等待等過程。需要一段時間,遇到時需要等一段時間,耐心稍微等一會。過會自動就會好。
如果長時間還報錯,還在安全模式。可以手工設定退出安全模式。
[root@hadoop01 bin]# pwd
/usr/local/src/hadoop/hadoop-2.7.1/bin
[root@hadoop01 bin]# ./hadoop dfsadmin -safemode leave
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Safe mode is OFF
[root@hadoop01 bin]#
引數value的說明如下:
enter - 進入安全模式
leave - 強制NameNode離開安全模式
get - 返回安全模式是否開啟的資訊
wait - 等待,一直到安全模式結束
1.4 Hive後設資料庫的替換
後設資料:hive中記錄維護資料庫,表,資料之間關係的資料。
Hive中的後設資料存在傳統的關係型資料庫中。Derby資料庫。
Derby基於檔案,他只會維護hive啟動目錄下的後設資料,更換啟動目錄後原來的資料丟失。
Hive官方提供了一些替換Derby的備選方案,oracle(收費) , mysql(免費)
1.4.1 替換後設資料庫為mysql
- 修改配置檔案hive-site.xml
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.220.1: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> </configuration>
將配置檔案修改後並不能成功啟動hive,報錯如下:
原因,我們並沒有給hive相關的驅動包。
2.匯入驅動包
直接將mysql驅動包上傳到hive的lib目錄中即可
但是再次嘗試啟動仍然報錯,
沒有訪問許可權,解決辦法:開啟mysql外部訪問許可權。
3.開啟mysql外部訪問許可權
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges; #更新許可權
如果上面修改後還提示許可權錯誤,修改指定機器
grant all privileges on *.* to 'root'@'hadoop01' identified by 'root' with grant option;
flush privileges;
4.再次啟動hive
1.4.2 Hive後設資料庫字符集必須為latin1
修改後設資料庫hive字符集為latin1:
登入到我們使用過的mysql中
Mysql> ALTER DATABASE hive DEFAULT CHARACTER SET latin1;
1.5 後設資料資訊
DBS:資料庫後設資料資訊
TBLS:表的後設資料資訊
SDS:表的詳細資訊
COLUMNS_V2:列後設資料資訊
1.6 Hadoop常用命令
啟動:start-all.sh
關閉:stop-all.sh
格式化:hdfs namenode -format
建立目錄:hadoop fs -mkdir /user
上傳檔案:hadoop fs -put ‘檔案路徑’ /user
刪除檔案:hadoop fs -rm /user/book.txt
刪除目錄:hadoop fs -rm -r /user
1.7 內部表和外部表
1.7.1 內部表(託管表):先有表後有資料
建立內部表:
Create table tb_book (id int ,name string)row format delimited fields termianted by ‘\t’;
載入資料:
load data local inpath '/usr/local/src/hive/data/book.txt' into table tb_book;
內部表在直接向HDFS中上傳檔案時,能夠正確管理。
刪除內部表:
Drop table tb_book;
後設資料資訊會被刪除,HDFS中的相關目錄和資料也會被刪除。
1.7.2 外部表:先有資料後有表
準備資料:
Hadoop fs -mkdir /data
Hadoop fs -put ‘檔案路徑’ /data
建立外部表:
create external table ext_book(id int, name string) row format delimited fields terminated by '\t' location '/data';
直接載入資料到HDFS中,hive是可以正常維護的。
刪除外部表
Drop table tb_stu;
後設資料會被刪除,但是HDFS中的檔案不會被刪除。
1.8 分割槽表
分割槽表,實現了資料倉儲中面向主題的設計模式。
1.8.1 建立單級分割槽表
create table tb_book (id int,name string) partitioned by (country string) row format delimited fields terminated by '\t';
1.8.2 載入資料
load data local inpath '/usr/local/src/hive/data/ch.txt' overwrite into table tb_book partition (country='ch');
1.8.3 檢視資料
發現結果集多了一列ch
Hive中的分割槽表中的分割槽其實就是表目錄下的一個資料夾。
手動載入資料到HDFS中即使按照他的規則建立了相關目錄也沒有能夠正確維護。
我們需要修改表,新增對應的分割槽資訊後設資料。
1.8.4 新增分割槽資訊
Alter table tb_book add partition (country=’ch’);
1.8.4.1 按分割槽查詢資料
Select * from tb_book where country = ‘ch’;
1.8.5 建立多級分割槽表
create table tb_book2 (id int,name string) partitioned by (country string,gender string) row format delimited fields terminated by '\t';
載入資料
load data local inpath '/usr/local/src/hive/data/jp_male.txt' overwrite into table tb_book2 partition (country='jp',gender='male');
查詢資料
Select * from tb_book2 where country = ‘ch’ and gender = ‘male’;
1.9 分桶表
分桶通過hash模餘的方式,提取部分資料作為測試資料。
1.9.1 建立分桶表
create table tb_teacher(id int,name string) clustered by (id) into 4 buckets row format delimited fields terminated by ',';
1.9.2 從其他表中查出資料插入分桶表
insert overwrite table tb_teacher select * from tb_tmp;
1.9.3 資料取樣
Select * from table_name tablesample (bucket x out of y on id);
其中x為第幾個桶,不能大於總桶數, y為選取資料的步長(幾個桶取一次資料)。Y應為桶數的因數或倍數,當y大於桶數時,選取結果非整桶抽取,而是抽取每桶中的y除以桶數分之一,即:1/(y/桶數)
Hive還支援用百分比的方式進行取樣,但是該資料取出的是前百分之多少,不具備代表性。
select * from tb_tmp tablesample (50 percent);