Hbase基礎(十五):與Hive的整合
1.1HBase與Hive的對比
1.Hive
(1) 資料倉庫
Hive的本質其實就相當於將HDFS中已經儲存的檔案在Mysql中做了一個雙射關係,以方便使用HQL去管理查詢。
(2) 用於資料分析、清洗
Hive適用於離線的資料分析和清洗,延遲較高。
(3) 基於HDFS、MapReduce
Hive儲存的資料依舊在DataNode上,編寫的HQL語句終將是轉換為MapReduce程式碼執行。
2.HBase
(1) 資料庫
是一種面向列族儲存的非關係型資料庫。
(2) 用於儲存結構化和非結構化的資料
適用於單表非關係型資料的儲存,不適合做關聯查詢,類似JOIN等操作。
(3) 基於HDFS
資料持久化儲存的體現形式是HFile,存放於DataNode中,被ResionServer以region的形式進行管理。
(4) 延遲較低,接入線上業務使用
面對大量的企業資料,HBase可以直線單表大量資料的儲存,同時提供了高效的資料訪問速度。
1.2HBase與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>
1.案例一
目標:建立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檢視,都生成了對應的表
(2) 在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';
(3) 向Hive中間表中load資料
hive> load data local inpath '/home/admin/softwares/data/emp.txt' into table emp;
(4) 通過insert命令將中間表中的資料匯入到Hive關聯Hbase的那張表中
hive> insert into table hive_hbase_emp_table select * from emp;
(5) 檢視Hive以及關聯的HBase表中是否已經成功的同步插入了資料
Hive:
hive> select * from hive_hbase_emp_table;
HBase:
Hbase> scan ‘hbase_emp_table’
2.案例二
目標:在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");
(2) 關聯後就可以使用Hive函式進行一些分析操作了
hive (default)> select * from relevance_hbase_emp;