1.文档编写目的
本篇文章主要介绍如何在Hive中集成HBase,将HBase表映射成Hive表,实现在beeline中查询或者修改HBase的表数据。
- 测试环境
1.集群是Cloudera Enterprise 7.3.1和Cloudera Runtime 7.1.6
2.系统均为RedHat 7.6
3.集群已启用 Kerberos
4.OpenLADP 2.4.44-23.el7_9
2.配置HBase与Hive集成
1.登录CM,下载HBase的配置文件,解压后打开hbase-site.xml
2.在安装了HBase的服务器节点输入命令:
代码语言:javascript复制hbase mapredcp|tr : ,
注意:这个命令已经将输出“:”替换成英文逗号“,”分隔。
3.去Hive服务下,配置,hive-site.xml 的 Hive 服务高级配置代码段(安全阀)
代码语言:javascript复制<property>
<name>hive.aux.jars.path</name>
<value>
上面hbase mapredcp命令输出内容
</value>
</property>
<property>
上面步骤中hbase-site.xml文件的内容
</property>
上面的配置完成后,保存并重启Hive 服务。
3.测试
1、在hbase shell中创建HBase表
代码语言:javascript复制create "test", "C1"
put "test", "01", "C1:ID", "0001"
put "test", "01", "C1:Name", "aa"
put "test", "01", "C1:Company", "company1"
2、在beeline中创建hive表映射到hbase,可以查询到数据
代码语言:javascript复制CREATE EXTERNAL TABLE `hbase_table_test`(
`key` string,
`id` string,
`name` string,
`company` string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping'=':key,C1:ID,C1:Name,C1:Company')
TBLPROPERTIES ('hbase.mapred.output.outputtable'='test','hbase.table.name'='test');
3、插入数据
代码语言:javascript复制insert into hbase_table_test values("03", "0003", "bb", "company3");
4、查看hbase已经插入了对应的内容
代码语言:javascript复制INSERT OVERWRITE TABLE hbase_table_test SELECT key, "0002" AS id, "abc" AS name, "company2" AS company FROM hbase_table_test WHERE key="03";
修改成功。
5、验证内部表和外部表区别
代码语言:javascript复制CREATE TABLE `hbase_table_no`(
`key` int,
`id` string,
`name` string,
`company` string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping'=':key,C1:ID,C1:Name,C1:Company')
TBLPROPERTIES ('hbase.mapred.output.outputtable'='no','hbase.table.name'='no');
CREATE EXTERNAL TABLE `hbase_table_no1`(
`key` int,
`id` string,
`name` string,
`company` string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping'=':key,C1:ID,C1:Name,C1:Company')
TBLPROPERTIES ('hbase.mapred.output.outputtable'='no1','hbase.table.name'='no1');
5、分别插入数据后,drop table
代码语言:javascript复制insert into hbase_table_no values (1, "id", "name", "com");
insert into hbase_table_no1 values (1, "id", "name", "com");
drop table hbase_table_no;
drop table hbase_table_no1;
代码语言:javascript复制
代码语言:javascript复制6、查看hbase,发现只有no1存在。
代码语言:javascript复制
4.总结
1、“hbase mapredcp|tr : ,”为将前面输入的“:”替换为“,”。
2、建立的hive表只是建立的映射关系,任何修改会在HBase表中生效。
3、无论内部表或者外部表都可以指定一个不存在的HBase表,两种表的区别在于内部表多了两个属性
代码语言:javascript复制'TRANSLATED_TO_EXTERNAL'='TRUE'
'external.table.purge'='TRUE'
代码语言:javascript复制
4、在Hive中drop table内部表(不加EXTERNAL)会删除掉关联的HBase表,在Hive中drop table外部表(加EXTERNAL)会保留关联的HBase表。