HBase 與Hive的集成詳解

HBase與Hive的對比

Hive

  1. 數據倉庫
    Hive的本質其實就相當於將HDFS中已經存儲的文件在Mysql中做了一個雙射關係,以方便使用HQL去管理查詢。
  2. 用於數據分析、清洗
    Hive適用於離線的數據分析和清洗,延遲較高。
  3. 基於HDFS、MapReduce
    Hive存儲的數據依舊在DataNode上,編寫的HQL語句終將是轉換爲MapReduce代碼執行。

HBase

  1. 數據庫
    是一種面向列存儲的非關係型數據庫。
  2. 用於存儲結構化和非結構化的數據
    適用於單表非關係型數據的存儲,不適合做關聯查詢,類似JOIN等操作。
  3. 基於HDFS
    數據持久化存儲的體現形式是Hfile,存放於DataNode中,被ResionServer以region的形式進行管理。
  4. 延遲較低,接入在線業務使用
    面對大量的企業數據,HBase可以直線單表大量數據的存儲,同時提供了高效的數據訪問速度。

HBase與Hive集成使用

尖叫提示:HBase與Hive的集成在最新的兩個版本中無法兼容。所以,我們只能含着淚勇敢的重新編譯:hive-hbase-handler-1.2.2.jar!!好氣!!

環境準備

因爲我們後續可能會在操作Hive的同時對HBase也會產生影響,所以Hive需要持有操作HBase的Jar,那麼接下來拷貝Hive所依賴的Jar包(或者使用軟連接的形式)。

export HBASE_HOME=/opt/module/hbase
export HIVE_HOME=/opt/module/hive

ln -s $HBASE_HOME/lib/hbase-common-1.3.1.jar  $HIVE_HOME/lib/hbase-common-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-server-1.3.1.jar $HIVE_HOME/lib/hbase-server-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-client-1.3.1.jar $HIVE_HOME/lib/hbase-client-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-protocol-1.3.1.jar $HIVE_HOME/lib/hbase-protocol-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-it-1.3.1.jar $HIVE_HOME/lib/hbase-it-1.3.1.jar
ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop-compat-1.3.1.jar

同時在hive-site.xml中修改zookeeper的屬性,如下:

<property>
  <name>hive.zookeeper.quorum</name>
  <value>hadoop102,hadoop103,hadoop104</value>
  <description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
<property>
  <name>hive.zookeeper.client.port</name>
  <value>2181</value>
  <description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>

案例一

目標:建立Hive表,關聯HBase表,插入數據到Hive表的同時能夠影響HBase表。
分步實現:

  1. 在Hive中創建表同時關聯HBase
CREATE TABLE hive_hbase_emp_table(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");

提示:完成之後,可以分別進入Hive和HBase查看,都生成了對應的表

  1. 在Hive中創建臨時中間表,用於load文件中的數據
    提示:不能將數據直接load進Hive所關聯HBase的那張表中
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
  1. 向Hive中間表中load數據
hive> load data local inpath '/home/admin/softwares/data/emp.txt' into table emp;
  1. 通過insert命令將中間表中的數據導入到Hive關聯HBase的那張表中
hive> insert into table hive_hbase_emp_table select * from emp;
  1. 查看Hive以及關聯的HBase表中是否已經成功的同步插入了數據
Hive:
hive> select * from hive_hbase_emp_table;
HBase:
hbase> scan ‘hbase_emp_table’

案例二

目標:在HBase中已經存儲了某一張表hbase_emp_table,然後在Hive中創建一個外部表來關聯HBase中的hbase_emp_table這張表,使之可以藉助Hive來分析HBase這張表中的數據。
注:該案例2緊跟案例1的腳步,所以完成此案例前,請先完成案例1。
分步實現:

  1. 在Hive中創建外部表
CREATE EXTERNAL TABLE relevance_hbase_emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = 
":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") 
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
  1. 關聯後就可以使用Hive函數進行一些分析操作了
hive (default)> select * from relevance_hbase_emp;

關注微信公衆號
簡書:https://www.jianshu.com/u/0278602aea1d
CSDN:https://blog.csdn.net/u012387141

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章