天天看點

基于Hadoop資料倉庫Hive1.2部署及使用

接下來安裝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&gt; create database hive;</code>

<code>mysql&gt; grant all on *.* to</code><code>'hive'</code><code>@</code><code>'%'</code> <code>identified by </code><code>'hive'</code><code>;</code>

<code>mysql&gt; 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>&lt;configuration&gt;</code>

<code>    </code><code>&lt;!--以下是mysql連接配接資訊--&gt;</code>

<code>    </code><code>&lt;property&gt;</code>

<code>        </code><code>&lt;name&gt;javax.jdo.option.connectionurl&lt;</code><code>/name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;jdbc:mysql:</code><code>//192</code><code>.168.18.210:3306</code><code>/hive</code><code>?createdatabaseifnotexist=</code><code>true</code><code>&lt;</code><code>/value</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/property</code><code>&gt;</code>

<code>        </code><code>&lt;name&gt;javax.jdo.option.connectiondrivername&lt;</code><code>/name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;com.mysql.jdbc.driver&lt;</code><code>/value</code><code>&gt;</code>

<code>        </code><code>&lt;name&gt;javax.jdo.option.connectionusername&lt;</code><code>/name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;hive_user&lt;</code><code>/value</code><code>&gt;</code>

<code>        </code><code>&lt;name&gt;javax.jdo.option.connectionpassword&lt;</code><code>/name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;hive_pass&lt;</code><code>/value</code><code>&gt;</code>

<code>&lt;</code><code>/configuration</code><code>&gt;</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 &amp;   #啟動遠端模式,否則你隻能在本地登入</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&gt; 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>&lt;!--通過thrift方式連接配接hive--&gt;</code>

<code>   </code><code>&lt;property&gt;</code>

<code>       </code><code>&lt;name&gt;hive.metastore.uris&lt;</code><code>/name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;thrift:</code><code>//192</code><code>.168.18.215:9083&lt;</code><code>/value</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>/property</code><code>&gt;</code>

配置好連接配接資訊,連接配接指令行:

<code># /opt/apache-hive-1.2.0-bin/bin/hive</code>

7.hive常用sql指令

 7.1 先建立一個測試庫

<code> </code><code>hive&gt; create database </code><code>test</code><code>;</code>

 7.2 建立tb1表,并指定字段分隔符為tab鍵(否則會插入null)

<code> </code><code>hive&gt; 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&gt; create table tb3 like tb1;</code>

 檢視下表結構:

<code> </code><code>hive&gt; 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&gt; 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&gt; load data inpath </code><code>'/kv.txt'</code><code>overwrite into table tb1;</code>

 7.5 查詢是否導入成功

<code> </code><code>hive&gt; </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&gt;.分區表是在建立表時指定的分區空間

 2&gt;.一個表可以有一個或多個分區,意思把資料劃分成塊

 3&gt;.分區以字段的形式在表結構中,不存放實際資料内容

 分區表優點:将表中資料根據條件配置設定到不同的分區中,縮小查詢範圍,提高檢索速度和處理性能。

 單分區表:

 7.6 建立單分區表tb2(hdfs表目錄下隻有一級目錄):

<code>hive&gt; 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&gt; 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&gt; 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&gt; </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&gt; 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&gt; 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&gt; 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&gt; </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>&lt;span style=</code><code>"color:rgb(0,0,0);"</code><code>&gt; </code><code># hadoop fs -ls -r /user/hive/warehouse/test.db/tb3&lt;br&gt; drwxr-xr-x   - root supergroup          0 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26&lt;br&gt; drwxr-xr-x   - root supergroup          0 2015-06-26 04:35 /user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing&lt;br&gt; -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&lt;br&gt; drwxr-xr-x   - root supergroup          0 2015-06-26 04:45 /user/hive/warehouse/test.db/tb3/dt=2015-06-27&lt;br&gt; drwxr-xr-x   - root supergroup          0 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai&lt;br&gt; -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&lt;br&gt;&lt;/span&gt;</code>

 可以看到表中一級dt分區目錄下又分成了location分區。

 7.14 檢視表分區資訊

<code> </code><code>hive&gt; show partitions tb2;</code>

 7.15 根據分區查詢資料

<code> </code><code>hive&gt; </code><code>select</code> <code>name from tb3 where dt=</code><code>'2015-06-27'</code><code>;</code>

 7.16 重命名分區

<code> </code><code>hive&gt; 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&gt; 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&gt; show tables </code><code>'tb*'</code><code>;</code>

 7.19 給表新添加一列

<code> </code><code>hive&gt; alter table tb1 addcolumns (commnet string);</code>

 7.20 重命名表

<code> </code><code>hive&gt; alter table tb1 rename to new_tb1;</code>

 7.21 删除表

<code> </code><code>hive&gt; 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>

上一篇: boost date_time
下一篇: progress_display