接下來安裝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中繼資料存放庫和連接配接使用者
1
2
3
<code>mysql> create database hive;</code>
<code>mysql> grant all on *.* to</code><code>'hive'</code><code>@</code><code>'%'</code> <code>identified by </code><code>'hive'</code><code>;</code>
<code>mysql> flush privileges;</code>
2.安裝與配置hive(在hmaster0安裝)
<code># tar zxvf apache-hive-1.2.0-bin.tar.gz</code>
<code># mv apache-hive-1.2.0-bin /opt</code>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<code># vi hive-site.xml</code>
<code><configuration></code>
<code> </code><code><!--以下是mysql連接配接資訊--></code>
<code> </code><code><property></code>
<code> </code><code><name>javax.jdo.option.connectionurl<</code><code>/name</code><code>></code>
<code> </code><code><value>jdbc:mysql:</code><code>//192</code><code>.168.18.210:3306</code><code>/hive</code><code>?createdatabaseifnotexist=</code><code>true</code><code><</code><code>/value</code><code>></code>
<code> </code><code><</code><code>/property</code><code>></code>
<code> </code><code><name>javax.jdo.option.connectiondrivername<</code><code>/name</code><code>></code>
<code> </code><code><value>com.mysql.jdbc.driver<</code><code>/value</code><code>></code>
<code> </code><code><name>javax.jdo.option.connectionusername<</code><code>/name</code><code>></code>
<code> </code><code><value>hive_user<</code><code>/value</code><code>></code>
<code> </code><code><name>javax.jdo.option.connectionpassword<</code><code>/name</code><code>></code>
<code> </code><code><value>hive_pass<</code><code>/value</code><code>></code>
<code><</code><code>/configuration</code><code>></code>
3.配置系統變量
<code># vi /etc/profile</code>
<code>hive_home=</code><code>/opt/apache-hive-1</code><code>.2.0-bin</code>
<code>path=$path:$hive_home</code><code>/bin</code>
<code>export</code> <code>hive_home path</code>
<code># source /etc/profile</code>
4.啟動hive
<code># hive --service metastore & #啟動遠端模式,否則你隻能在本地登入</code>
5.檢查是否正常啟動
檢視程序是否啟動:
<code>[root@hmaster0 ~]</code><code># jps</code>
<code>2615 dfszkfailovercontroller</code>
<code>30027 resourcemanager</code>
<code>29656 namenode</code>
<code>25451 jps</code>
<code>10270 hmaster</code>
<code>14975 runjar </code><code>#會啟動一個runjar程序</code>
執行hive指令會進入指令界面:
<code>[root@hmaster0 ~]</code><code># hive</code>
<code>logging initialized usingconfiguration </code><code>in</code> <code>file</code><code>:</code><code>/opt/apache-hive-1</code><code>.2.0-bin</code><code>/conf/hive-log4j</code><code>.properties</code>
<code>hive> show databases;</code>
<code>ok</code>
<code>default</code>
<code>time taken: 0.986 seconds,fetched: 1 row(s)</code>
檢視資料庫,預設有一個default庫,現在就可以用你熟悉的sql語言了。
6.用戶端連接配接hive(必須有hadoop環境)
<code><!--通過thrift方式連接配接hive--></code>
<code> </code><code><property></code>
<code> </code><code><name>hive.metastore.uris<</code><code>/name</code><code>></code>
<code> </code><code><value>thrift:</code><code>//192</code><code>.168.18.215:9083<</code><code>/value</code><code>></code>
<code> </code><code><</code><code>/property</code><code>></code>
配置好連接配接資訊,連接配接指令行:
<code># /opt/apache-hive-1.2.0-bin/bin/hive</code>
7.hive常用sql指令
7.1 先建立一個測試庫
<code> </code><code>hive> create database </code><code>test</code><code>;</code>
7.2 建立tb1表,并指定字段分隔符為tab鍵(否則會插入null)
<code> </code><code>hive> create table tb1(</code><code>id</code> <code>int,name string)row </code><code>format</code> <code>delimited fields terminated by </code><code>'\t'</code>
如果想再建立一個表,而且表結構和tb1一樣,可以這樣:
<code> </code><code>hive> create table tb3 like tb1;</code>
檢視下表結構:
<code> </code><code>hive> describe tb3;</code>
<code> </code><code>ok</code>
<code> </code><code>id</code> <code>int </code>
<code> </code><code>name string </code>
<code> </code><code>time taken: 0.091 seconds, fetched: 2 row(s)</code>
7.3 從本地檔案中導入資料到hive表
先建立資料檔案,鍵值要以tab鍵空格:
<code> </code><code># cat kv.txt </code>
<code> </code><code>1 zhangsan</code>
<code> </code><code>2 lisi</code>
<code> </code><code>3 wangwu</code>
再導入資料:
<code> </code><code>hive> load data </code><code>local</code> <code>inpath</code><code>'/root/kv.txt'</code> <code>overwrite into table tb1;</code>
7.4 從hdfs中導入資料到hive表
<code> </code><code># hadoop fs -cat /kv.txt #檢視hdfs中要導入的資料</code>
<code> </code><code>hive> load data inpath </code><code>'/kv.txt'</code><code>overwrite into table tb1;</code>
7.5 查詢是否導入成功
<code> </code><code>hive> </code><code>select</code> <code>* from tb1;</code>
<code> </code><code>time taken: 0.209 seconds,fetched: 3 row(s)</code>
部落格位址:http://lizhenliang.blog.51cto.com
上面是基本表的簡單操作,為了提高處理性能,hive引入了分區機制,那我們就了解分區表概念:
1>.分區表是在建立表時指定的分區空間
2>.一個表可以有一個或多個分區,意思把資料劃分成塊
3>.分區以字段的形式在表結構中,不存放實際資料内容
分區表優點:将表中資料根據條件配置設定到不同的分區中,縮小查詢範圍,提高檢索速度和處理性能。
單分區表:
7.6 建立單分區表tb2(hdfs表目錄下隻有一級目錄):
<code>hive> create table tb2(idint,name string) partitioned by (dt string) row </code><code>format</code> <code>delimited fieldsterminated by </code><code>'\t'</code><code>;</code>
注:dt可以了解為分區名稱。
7.7 從檔案中把資料導入到hive分區表,并定義分區資訊
<code> </code><code>hive> load data </code><code>local</code> <code>inpath </code><code>'/root/kv.txt'</code> <code>into table tb2 partition (dt=</code><code>'2015-06-26'</code><code>);</code>
<code> </code><code>hive> load data </code><code>local</code> <code>inpath </code><code>'/root/kv.txt'</code> <code>into table tb2 partition (dt=</code><code>'2015-06-27'</code><code>);</code>
7.8 檢視表資料
<code> </code><code>hive> </code><code>select</code> <code>* from tb2;</code>
<code> </code><code>1 zhangsan 2015-06-26</code>
<code> </code><code>2 lisi 2015-06-26</code>
<code> </code><code>3 wangwu 2015-06-26</code>
<code> </code><code>1 zhangsan 2015-06-27</code>
<code> </code><code>2 lisi 2015-06-27</code>
<code> </code><code>3 wangwu 2015-06-27</code>
<code> </code><code>time taken: 0.223 seconds,fetched: 6 row(s)</code>
7.9 檢視hdfs倉庫中表目錄變化
<code> </code><code># hadoop fs -ls -r /user/hive/warehouse/test.db/tb2</code>
<code> </code><code>drwxr-xr-x - root supergroup 0 2015-06-26 04:12</code><code>/user/hive/warehouse/test</code><code>.db</code><code>/tb2/dt</code><code>=2015-06-26</code>
<code> </code><code>-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:12 </code><code>/user/hive/warehouse/test</code><code>.db</code><code>/tb2/dt</code><code>=2015-06-26</code><code>/kv</code><code>.txt</code>
<code> </code><code>drwxr-xr-x - root supergroup 0 2015-06-26 04:15</code><code>/user/hive/warehouse/test</code><code>.db</code><code>/tb2/dt</code><code>=2015-06-27</code>
<code> </code><code>-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:15</code><code>/user/hive/warehouse/test</code><code>.db</code><code>/tb2/dt</code><code>=2015-06-27</code><code>/kv</code><code>.txt</code>
可以看到tb2表導入的資料根據日期将資料劃分到不同目錄下。
多分區表:
7.10 建立多分區表tb3(hdfs表目錄下有一級目錄,一級目錄下再有子級目錄)
<code> </code><code>hive> create table tb3(idint,name string) partitioned by (dt string,location string) row formatdelimited fields terminated by </code><code>'\t'</code><code>;</code>
7.11 從檔案中把資料導入到hive分區表,并定義分區資訊
<code> </code><code>hive> load data </code><code>local</code> <code>inpath </code><code>'/root/kv.txt'</code> <code>into table tb3 partition (dt=</code><code>'2015-06- 26'</code><code>,location=</code><code>'beijing'</code><code>);</code>
<code> </code><code>hive> load data </code><code>local</code> <code>inpath </code><code>'/root/kv.txt'</code> <code>into table tb3 partition (dt=</code><code>'2015-06-27'</code><code>,location=</code><code>'shanghai'</code><code>);</code>
7.12 檢視表資料
<code> </code><code>hive> </code><code>select</code> <code>* from tb3;</code>
<code> </code><code>1 zhangsan 2015-06-26 beijing</code>
<code> </code><code>2 lisi 2015-06-26 beijing</code>
<code> </code><code>3 wangwu 2015-06-26 beijing</code>
<code> </code><code>1 zhangsan 2015-06-26 shanghai</code>
<code> </code><code>2 lisi 2015-06-26 shanghai</code>
<code> </code><code>3 wangwu 2015-06-26 shanghai</code>
<code> </code><code>time taken: 0.208 seconds,fetched: 6 row(s)</code>
7.13 檢視hdfs倉庫中表目錄變化
<code><span style=</code><code>"color:rgb(0,0,0);"</code><code>> </code><code># hadoop fs -ls -r /user/hive/warehouse/test.db/tb3<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:35 /user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing<br> -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<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:45 /user/hive/warehouse/test.db/tb3/dt=2015-06-27<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai<br> -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<br></span></code>
可以看到表中一級dt分區目錄下又分成了location分區。
7.14 檢視表分區資訊
<code> </code><code>hive> show partitions tb2;</code>
7.15 根據分區查詢資料
<code> </code><code>hive> </code><code>select</code> <code>name from tb3 where dt=</code><code>'2015-06-27'</code><code>;</code>
7.16 重命名分區
<code> </code><code>hive> alter table tb3 partition (dt=</code><code>'2015-06-27'</code><code>,location=</code><code>'shanghai'</code><code>) rename to partition(dt=</code><code>'20150627'</code><code>,location=</code><code>'shanghai'</code><code>);</code>
7.17 删除分區
<code> </code><code>hive> alter table tb3 droppartition (dt=</code><code>'2015-06-26'</code><code>,location=</code><code>'shanghai'</code><code>);</code>
7.18 模糊搜尋表
<code> </code><code>hive> show tables </code><code>'tb*'</code><code>;</code>
7.19 給表新添加一列
<code> </code><code>hive> alter table tb1 addcolumns (commnet string);</code>
7.20 重命名表
<code> </code><code>hive> alter table tb1 rename to new_tb1;</code>
7.21 删除表
<code> </code><code>hive> drop table new_tb1;</code>
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下:
<code># cp /opt/apache-hive-1.2.0-bin/lib/jline-2.12.jar /opt/hadoop-2.6.0/share/hadoop/yarn/lib/</code>
<code># rm /opt/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar</code>
報錯2:
javax.jdo.jdofatalinternalexception:error creating transactional connection factory
解決方法,在百度下載下傳java連接配接mysql包放到hive/lib下:
<code># cp mysql-connector-java-5.1.10-bin.jar /opt/apache-hive-1.2.0-bin/lib</code>
<code></code>