您好,登錄后才能下訂單哦!
以下基于上篇Hadoop2.6集群部署:http://lizhenliang.blog.51cto.com/7876557/1661354
接下來安裝Hadoop數據倉庫Hive,上節了解HBase簡單使用,聽起來HBase與Hive有些類似,概念也有點模糊,那我們先了解下他們之間有什么區別:
HBase是一種分布式、面向列的NoSQL數據庫,基于HDFS存儲,以表的形式存儲數據,表由行和列組成,列劃分到列族中。HBase不提供類SQL查詢語言,要想像SQL這樣查詢數據,可以使用Phonix,讓SQL查詢轉換成hbase的掃描和對應的操作,也可以使用現在說講Hive倉庫工具,讓HBase作為Hive存儲。
Hive是運行在Hadoop之上的數據倉庫,將結構化的數據文件映射為一張數據庫表,提供簡單類SQL查詢語言,稱為HQL,并將SQL語句轉換成MapReduce任務運算。有利于利用SQL語言查詢、分析數據,適于處理不頻繁變動的數據。Hive底層可以是HBase或者HDFS存儲的文件。
兩者都是基于Hadoop上不同的技術,相互結合使用,可處理企業中不同類型的業務,利用Hive處理非結構化離線分析統計,利用HBase處理在線查詢。
Hive三種元數據存儲方式:
1>.本地derby存儲,只允許一個用戶連接Hive,適用于測試環境
2>.本地/遠程MySQL存儲,支持多用戶連接Hive,適用于生產環境
三、Hive安裝與配置(以下將元數據存儲到遠程MySQL配置)
1.在MySQL創建Hive元數據存放庫和連接用戶
mysql> create database hive; mysql> grant all on *.* to'hive'@'%' identified by 'hive'; mysql> flush privileges;
2.安裝與配置Hive(在HMaster0安裝)
# tar zxvf apache-hive-1.2.0-bin.tar.gz # mv apache-hive-1.2.0-bin /opt
# vi hive-site.xml <configuration> <!--以下是MySQL連接信息--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.18.210: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>hive_user</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive_pass</value> </property> </configuration>
3.配置系統變量
# vi /etc/profile HIVE_HOME=/opt/apache-hive-1.2.0-bin PATH=$PATH:$HIVE_HOME/bin export HIVE_HOME PATH # source /etc/profile
4.啟動Hive
# hive --service metastore & #啟動遠程模式,否則你只能在本地登錄
5.檢查是否正常啟動
查看進程是否啟動:
[root@HMaster0 ~]# jps 2615 DFSZKFailoverController 30027 ResourceManager 29656 NameNode 25451 Jps 10270 HMaster 14975 RunJar #會啟動一個RunJar進程
執行hive命令會進入命令界面:
[root@HMaster0 ~]# hive Logging initialized usingconfiguration in file:/opt/apache-hive-1.2.0-bin/conf/hive-log4j.properties hive> show databases; OK default Time taken: 0.986 seconds,Fetched: 1 row(s)
查看數據庫,默認有一個default庫,現在就可以用你熟悉的SQL語言了。
6.客戶端連接Hive(必須有Hadoop環境)
# tar zxvf apache-hive-1.2.0-bin.tar.gz # mv apache-hive-1.2.0-bin /opt
# vi hive-site.xml <configuration> <!--通過thrift方式連接hive--> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.18.215:9083</value> </property> </configuration>
配置好連接信息,連接命令行:
# /opt/apache-hive-1.2.0-bin/bin/hive
7.Hive常用SQL命令
7.1 先創建一個測試庫
hive> create database test;
7.2 創建tb1表,并指定字段分隔符為tab鍵(否則會插入NULL)
hive> create table tb1(id int,name string)row format delimited fields terminated by '\t'
如果想再創建一個表,而且表結構和tb1一樣,可以這樣:
hive> create table tb3 like tb1;
查看下表結構:
hive> describe tb3; OK id int name string Time taken: 0.091 seconds, Fetched: 2 row(s)
7.3 從本地文件中導入數據到Hive表
先創建數據文件,鍵值要以tab鍵空格:
# cat kv.txt 1 zhangsan 2 lisi 3 wangwu
再導入數據:
hive> load data local inpath'/root/kv.txt' overwrite into table tb1;
7.4 從HDFS中導入數據到Hive表
# hadoop fs -cat /kv.txt #查看hdfs中要導入的數據 1 zhangsan 2 lisi 3 wangwu hive> load data inpath '/kv.txt'overwrite into table tb1;
7.5 查詢是否導入成功
hive> select * from tb1; OK 1 zhangsan 2 lisi 3 wangwu Time taken: 0.209 seconds,Fetched: 3 row(s)
博客地址:http://lizhenliang.blog.51cto.com
上面是基本表的簡單操作,為了提高處理性能,Hive引入了分區機制,那我們就了解分區表概念:
1>.分區表是在創建表時指定的分區空間
2>.一個表可以有一個或多個分區,意思把數據劃分成塊
3>.分區以字段的形式在表結構中,不存放實際數據內容
分區表優點:將表中數據根據條件分配到不同的分區中,縮小查詢范圍,提高檢索速度和處理性能。
單分區表:
7.6 創建單分區表tb2(HDFS表目錄下只有一級目錄):
hive> create table tb2(idint,name string) partitioned by (dt string) row format delimited fieldsterminated by '\t';
注:dt可以理解為分區名稱。
7.7 從文件中把數據導入到Hive分區表,并定義分區信息
hive> load data local inpath '/root/kv.txt' into table tb2 partition (dt='2015-06-26'); hive> load data local inpath '/root/kv.txt' into table tb2 partition (dt='2015-06-27');
7.8 查看表數據
hive> select * from tb2; OK 1 zhangsan 2015-06-26 2 lisi 2015-06-26 3 wangwu 2015-06-26 1 zhangsan 2015-06-27 2 lisi 2015-06-27 3 wangwu 2015-06-27 Time taken: 0.223 seconds,Fetched: 6 row(s)
7.9 查看HDFS倉庫中表目錄變化
# hadoop fs -ls -R /user/hive/warehouse/test.db/tb2 drwxr-xr-x - root supergroup 0 2015-06-26 04:12/user/hive/warehouse/test.db/tb2/dt=2015-06-26 -rwxr-xr-x 3 root supergroup 27 2015-06-26 04:12 /user/hive/warehouse/test.db/tb2/dt=2015-06-26/kv.txt drwxr-xr-x - root supergroup 0 2015-06-26 04:15/user/hive/warehouse/test.db/tb2/dt=2015-06-27 -rwxr-xr-x 3 root supergroup 27 2015-06-26 04:15/user/hive/warehouse/test.db/tb2/dt=2015-06-27/kv.txt
可以看到tb2表導入的數據根據日期將數據劃分到不同目錄下。
多分區表:
7.10 創建多分區表tb3(HDFS表目錄下有一級目錄,一級目錄下再有子級目錄)
hive> create table tb3(idint,name string) partitioned by (dt string,location string) row formatdelimited fields terminated by '\t';
7.11 從文件中把數據導入到Hive分區表,并定義分區信息
hive> load data local inpath '/root/kv.txt' into table tb3 partition (dt='2015-06- 26',location='beijing'); hive> load data local inpath '/root/kv.txt' into table tb3 partition (dt='2015-06-27',location='shanghai');
7.12 查看表數據
hive> select * from tb3; OK 1 zhangsan 2015-06-26 beijing 2 lisi 2015-06-26 beijing 3 wangwu 2015-06-26 beijing 1 zhangsan 2015-06-26 shanghai 2 lisi 2015-06-26 shanghai 3 wangwu 2015-06-26 shanghai Time taken: 0.208 seconds,Fetched: 6 row(s)
7.13 查看HDFS倉庫中表目錄變化
# hadoop fs -ls -R /user/hive/warehouse/test.db/tb3
drwxr-xr-x - root supergroup 0 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26
drwxr-xr-x - root supergroup 0 2015-06-26 04:35 /user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing
-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing/kv.txt
drwxr-xr-x - root supergroup 0 2015-06-26 04:45 /user/hive/warehouse/test.db/tb3/dt=2015-06-27
drwxr-xr-x - root supergroup 0 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai
-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai/kv.txt
可以看到表中一級dt分區目錄下又分成了location分區。
7.14 查看表分區信息
hive> show partitions tb2;
7.15 根據分區查詢數據
hive> select name from tb3 where dt='2015-06-27';
7.16 重命名分區
hive> alter table tb3 partition (dt='2015-06-27',location='shanghai') rename to partition(dt='20150627',location='shanghai');
7.17 刪除分區
hive> alter table tb3 droppartition (dt='2015-06-26',location='shanghai');
7.18 模糊搜索表
hive> show tables 'tb*';
7.19 給表新添加一列
hive> alter table tb1 addcolumns (commnet string);
7.20 重命名表
hive> alter table tb1 rename to new_tb1;
7.21 刪除表
hive> drop table new_tb1;
8.啟動過程中遇到錯誤
報錯1:
[ERROR]Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError:Found class jline.Terminal, but interface was expected
解決方法,將hive/lib下jline包拷貝到hadoop/yarn/lib下:
# cp /opt/apache-hive-1.2.0-bin/lib/jline-2.12.jar /opt/hadoop-2.6.0/share/hadoop/yarn/lib/ # rm /opt/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar
報錯2:
javax.jdo.JDOFatalInternalException:Error creating transactional connection factory
解決方法,在百度下載java連接MySQL包放到hive/lib下:
# cp mysql-connector-java-5.1.10-bin.jar /opt/apache-hive-1.2.0-bin/lib
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。