如何將Hive與HBase整合聯用

版本說明:java

HDP:3.0.1.0sql

Hive:3.1.0shell

HBase:2.0.0apache

1、前言

以前學習 HBase 就有疑惑,HBase 雖然能夠存儲數億或數十億行數據,可是對於數據分析來講,不太友好,只提供了簡單的基於 Key 值的快速查詢能力,無法進行大量的條件查詢。微信

不過,Hive 與 HBase 的整合能夠實現咱們的這個目標。不只如此,還能經過 Hive 將數據批量地導入到 HBase 中。app

<!--more-->工具

Hive 與 HBase 整合的實現是利用二者自己對外的 API 接口互相通訊來完成的,其具體工做交由 Hive 的 lib 目錄中的 hive-hbase-handler-xxx.jar 工具類來實現對 HBase 數據的讀取。oop

2、適用場景

Hive 與 HBase 整合的適用場景:學習

**一、**經過 Hive 與 HBase 整合,能夠將 HBase 的數據經過 Hive 來分析,讓 HBase 支持 JOIN、GROUP 等 SQL 查詢語法。大數據

**二、**實現將批量數據導入到 HBase 表中。

3、依賴條件

須要有如下依賴,ambari 已經爲咱們作好了這一切:

  • 已有 HDFS、MapReduce、Hive、Zookeeper、HBase 環境。
  • 確保 Hive 的 lib 目錄下有 hive-hbase-handler-xxx.jar、Zookeeper jar、HBase Server jar、HBase Client jar 包。

4、使用HBase Hive集成

注意,這裏與HDP 2.x不一樣:在 HDP 3.0 中對 Hive-3.1.0 的更改是全部 StorageHandler 必須標記爲「外部」,沒有 StorageHandler 建立的非外部表。若是在建立 Hive 表時存在相應的 HBase 表,它將模仿「外部」表的 HDP 2.x 語義。若是在建立 Hive 表時不存在相應的 HBase 表,則它將模仿非外部表的 HDP 2.x 語義。

總結: 無論 HBase 表是否存在,在 Hive 中都要使用 external 表來與 HBase 表進行關聯,若是關聯的 HBase 表不存在,Hive 會自動建立Hbase 表。

5、示例

1. HBase表不存在

CREATE EXTERNAL TABLE hive_table (key int, value string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "default:hbase_table");

這裏簡單說一下建表時的參數:

  • hbase.columns.mapping 是必須的,這將會和 HBase 表的列族進行驗證。
  • hbase.table.name 屬性是可選的,默認指定 HBase 表名與 Hive 表名一致。

此時,hive_table 與 hbase_table 都是空的。咱們準備一些數據:

insert into hive_table (key, value) values(1, "www.ymq.io");

insert 語句會觸發 map 任務,以下圖所示:

任務完成以後,Hive 與 HBase 表中就都存在數據了。

# hive_table 表數據
+-----------------+-------------------+
| hive_table.key  | hive_table.value  |
+-----------------+-------------------+
| 1               | www.ymq.io        |
+-----------------+-------------------+
# hbase_table表數據
hbase(main):002:0> scan 'hbase_table'
ROW                                    COLUMN+CELL                                                                                                  
 1                                     column=cf1:val, timestamp=1558710260266, value=www.ymq.io                                                    
1 row(s)
Took 0.2400 seconds

當將 hive_table 表刪除,對應的 hbase_table 表不受影響,裏面依舊有數據。當刪除 hbase_table 表後,再查詢 hive_table 表數據,會報錯:Error: java.io.IOException: org.apache.hadoop.hbase.TableNotFoundException: hbase_table (state=,code=0),這是正常的。

注意!注意!注意: 在上述示例中,咱們使用的 insert 命令向 Hive 表中插入數據。對於批量數據的插入,仍是建議使用 load 命令,但對於 Hive 外部表來講,不支持 load 命令。咱們能夠先建立一個 Hive 內部表,將數據 load 到該表中,最後將查詢內部表的全部數據都插入到與 Hbase 關聯的 Hive 外部表中,就能夠了,至關於中轉一下。

2. HBase表已存在

建立 HBase 表:

create 'default:people', {NAME=>'basic_info'}, {NAME=>'other_info'}

插入一些數據:

put 'people', '00017','basic_info:name','tom'
put 'people', '00017','basic_info:age','17'
put 'people', '00017','basic_info:sex','man'
put 'people', '00017','other_info:telPhone','176xxxxxxxx'
put 'people', '00017','other_info:country','China'

put 'people', '00023','basic_info:name','mary'
put 'people', '00023','basic_info:age',23
put 'people', '00023','basic_info:sex','woman'
put 'people', '00023','basic_info:edu','college'
put 'people', '00023','other_info:email','cdsvo@163.com'
put 'people', '00023','other_info:country','Japan'

put 'people', '00018','basic_info:name','sam'
put 'people', '00018','basic_info:age','18'
put 'people', '00018','basic_info:sex','man'
put 'people', '00018','basic_info:edu','middle'
put 'people', '00018','other_info:telPhone','132xxxxxxxx'
put 'people', '00018','other_info:country','America'

put 'people', '00026','basic_info:name','Sariel'
put 'people', '00026','basic_info:age',26
put 'people', '00026','basic_info:edu','college'
put 'people', '00026','other_info:telPhone','178xxxxxxxx'
put 'people', '00026','other_info:email','12345@126.com'
put 'people', '00026','other_info:country','中國'

再建立一個簡單的 Hive 外部表,語法與以前的一致:

create external table people
(
id int,
name string,
age string,
sex string, 
edu string, 
country string, 
telPhone string,  
email string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = "
:key,
basic_info:name,
basic_info:age,
basic_info:sex,
basic_info:edu,
other_info:country,
other_info:telPhone,
other_info:email
")
tblproperties("hbase.table.name" = "default:people");

查詢所有數據:

select * from people;

條件查詢:

# 根據性別查詢
select * from people where sex = 'man';
# 根據年齡查詢
select * from people where age > 18;

這樣,咱們就可使用 Hive 來分析 HBase 中的數據了。

6、總結

  • 使用 hive-hbase-handler-xxx.jar 包實現 Hive 與 HBase 關聯。
  • Hive 讀取的是 HBase 表最新的數據。
  • 經過 Hive 建立的 HBase 表的值默認只有一個 VERSION ,可以後再修改 HBase 表值的最大 VERSION 數。
  • Hive 只顯示與 HBase 對應的列值,而那些沒有對應的 HBase 列在 Hive 表中不顯示。
  • Hive 表與 HBase 表關聯後,數據能夠在 Hive 端插入,也可在 HBase 中插入。
  • 建立 Hive 外部表與 HBase 的關聯,可實現將 Hive 數據導入到 HBase 中。該方式是利用二者自己對外的 API 接口互相通訊來完成的,在數據量不大(4T如下)的狀況下能夠選擇該方式導入數據。

點關注,不迷路

好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才

白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!

若是本篇博客有任何錯誤,請批評指教,不勝感激 !

本文來自: 微信公衆號【大數據實戰演練】。閱讀更多精彩好文,歡迎關注微信公衆號【大數據實戰演練】。

相關文章
相關標籤/搜索