一、實作功能
1.HBase自身的查詢非常有限,僅支援有限的scan get,做不了聚合查詢(max avg min max),也做不了分組聯合(jion)子查詢等,但是Hive是支援的,非常友好,非常強大,隻是Hive存儲不占優勢
2.是以,可以将資料儲存到HBase,但是可以通過hive映射表,使用hql做一些豐富查詢
3.缺點:雖然查詢功能豐富了,但是底層的執行依然是mapredcue,會比較的慢,失去了hbase快速查詢的優勢
二、內建步驟
1.設定環境變量
export HBASE_HOME=/opt/modules/hbase-1.2.0-cdh5.7.0
export HIVE_HOME_lib=/opt/modules/hive-1.1.0-cdh5.7.0/lib
2.設定軟連接配接
ln -s $HBASE_HOME/lib/hbase-server-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-server-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/hbase-client-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-client-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/hbase-protocol-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-protocol-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/hbase-it-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-it-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/htrace-core-3.2.0-incubating.jar $HIVE_HOME_lib/htrace-core-3.2.0-incubating.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-hadoop2-compat-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-hadoop-compat-1.2.0-cdh5.7.0.jar
ln -s $HBASE_HOME/lib/high-scale-lib-1.1.1.jar $HIVE_HOME_lib/high-scale-lib-1.1.1.jar
ln -s $HBASE_HOME/lib/hbase-common-1.2.0-cdh5.7.0.jar $HIVE_HOME_lib/hbase-common-1.2.0-cdh5.7.0.jar
3.配置檔案
hive的hive-site.xml中添加
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop</value>
</property>
三、測試
1.啟動環境
(1)hive
(2)yarn
(3)hbase
2.hive建表映射到hbase
(1)建立hive和hbase對應表
CREATE TABLE hive2hbase_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" = "emp");
解釋:
-》其中:key,表示拿出emp表中的第一列資料作為hbase的行鍵)
-》建立兩張表,hive2hbase_emp(hive中)和emp(hbase)
-》兩張表都是空的
(2)插入hive表資料
隻能通過查詢已經存在的表然後結合insert進行資料的導入
insert into table hive2hbase_emp select * from emp;
(3)hive中檢視結果
hive (default)> select * from default.hive2hbase_emp;
OK
hive2hbase_emp.empno hive2hbase_emp.ename hive2hbase_emp.job hive2hbase_emp.mgr hive2hbase_emp.hiredate hive2hbase_emp.sal hive2hbase_emp.comm hive2hbase_emp.deptno
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10
Time taken: 0.987 seconds, Fetched: 14 row(s)
(4)hbase中檢視結果
hbase(main):002:0> scan "emp"
ROW COLUMN+CELL
7369 column=info:deptno, timestamp=1543596157157, value=20
7369 column=info:ename, timestamp=1543596157157, value=SMITH
7369 column=info:hiredate, timestamp=1543596157157, value=1980-12-17
7369 column=info:job, timestamp=1543596157157, value=CLERK
7369 column=info:mgr, timestamp=1543596157157, value=7902
7369 column=info:sal, timestamp=1543596157157, value=800.0
7499 column=info:comm, timestamp=1543596157157, value=300.0
7499 column=info:deptno, timestamp=1543596157157, value=30
7499 column=info:ename, timestamp=1543596157157, value=ALLEN
7499 column=info:hiredate, timestamp=1543596157157, value=1981-2-20
7499 column=info:job, timestamp=1543596157157, value=SALESMAN
7499 column=info:mgr, timestamp=1543596157157, value=7698
7499 column=info:sal, timestamp=1543596157157, value=1600.0
7521 column=info:comm, timestamp=1543596157157, value=500.0
7521 column=info:deptno, timestamp=1543596157157, value=30
7521 column=info:ename, timestamp=1543596157157, value=WARD
7521 column=info:hiredate, timestamp=1543596157157, value=1981-2-22
7521 column=info:job, timestamp=1543596157157, value=SALESMAN
7521 column=info:mgr, timestamp=1543596157157, value=7698
7521 column=info:sal, timestamp=1543596157157, value=1250.0
(5)好處
內建之後的好處:資料在hbase中儲存,意味着表中的資料在hbase中是可以任意修改的
put 'emp','7369','info:sal','888.0'
3.hbase中的表映射到hive中
(1)必要條件:
-》映射hbase表資料,hive中建立的表必須是外部表
-》并且hbase中的rowkey必須要映射到hive中
(2)hive中操作
create external table hbase2hive(
id int,
name string,
age int
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name,info:age")
TBLPROPERTIES ("hbase.table.name" = "stu_info");
(3)hive中結果
hive (default)> select * from hbase2hive;
OK
hbase2hive.id hbase2hive.name hbase2hive.age
10001 ngsan 12
10002 lisi 13
10003 wangwu 14
10004 zhaoliu 15
10005 xieqi 16
10006 zhangsan 20
10011 ngsan 12
10012 lisi 13
10013 wangwu 14
10014 zhaoliu 15
10015 xieqi 16
Time taken: 1.658 seconds, Fetched: 11 row(s)
4.删除操作
(1)如果是hive映射到habse
删除hive中的表,對應hhbase中的會一起被删除
drop table hive2hbase_emp;
(2)如是hbase映射hive 删除hive中的表,是不會影響hbase中的表,
drop table hbase2hive;