Hive操作Hbase(详细配置及操作)

前言

HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说,不太友好,只提供了简单的基于 Key 值的快速查询能力,没法进行大量的条件查询。

不过,Hive 与 HBase 的整合可以实现我们的这个目标。不仅如此,还能通过 Hive 将数据批量地导入到 HBase 中。

Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的,其具体工作交由 Hive 的 lib 目录中的 hive-hbase-handler-xxx.jar 工具类来实现对 HBase 数据的读取。

版本:

组件版本号
Hadoop3.2.0
Hive3.1.1
Hbase2.2.6

适用场景

Hive 与 HBase 整合的适用场景:

**1、**通过 Hive 与 HBase 整合,可以将 HBase 的数据通过 Hive 来分析,让 HBase 支持 JOIN、GROUP 等 SQL 查询语法。

**2、**实现将批量数据导入到 HBase 表中。

开始配置

  1. 把hive安装目录的lib文件夹下的hbase开头的jar包删除,然后hbase安装目录下lib下hbase开头的几个jar拷贝到hive的lib文件夹下

    rm /usr/local/hive/lib/hbase*
    cp /usr/local/hbase/lib/hbase* /usr/local/hive/lib
    
  2. 添加hive/conf的hive-site.xml配置,value为你的集群节点

    <property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop2,hadoop3,hadoop4</value>
    </property>
    

启动Hbase hive

操作

1. 创建一张Hbase表
create 'hbase_game','lol','cf'
2. 在Hive创建一张Hbase的映射表(外部表)
CREATE EXTERNAL TABLE hive_hbase_game (id int, lol_name string,level string,cf_name string,gun string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,lol:name,lol:level,cf:name,cf:gun")
TBLPROPERTIES ("hbase.table.name" = "hbase_game");

参数说明:

  • hbase.columns.mapping 是必须的,这将会和 HBase 表的列族进行验证。
  • hbase.table.name 属性是可选的,默认指定 HBase 表名与 Hive 表名一致。
3. 创建一张原始表来导入本地数据

Hive外部表不能使用load加载数据,所以需要创建一张内部表把本地数据加载进去

CREATE  TABLE 
game_original (id int, lol_name string,level string,cf_name string,gun string) 
row format delimited
fields terminated by ',';

本地的数据game.txt

1,别动我辅助,青铜,打偏了,AK
2,别动我BUFF,黑铁,狙击手,AWM

加载本地数据到原始表

load data local inpath '/usr/local/hive/game.txt' 
overwrite into table game_original;
4. 将原始表数据插入到映射表
from game_original 
insert overwrite table hive_hbase_game 
select key,lol_name,level,cf_name,gun;
5. 在Hive&Hbase查询数据
hive> select * from hive_hbase_game;
1     别动我辅助   青铜   打偏了     AK
2     别动我BUFF  黑铁   狙击手     AWM
hbase(main):013:0> scan 'game'
ROW                                    COLUMN+CELL
 1           column=cf:gun, timestamp=1610613495247, value='AK'
 1           column=cf:name, timestamp=1610613495247, value='\xE6\x89\x93\xE5\x81\x8F\xE4\xBA\x86'
 1           column=lol:level, timestamp=1610613495247, value='\xE9\x9D\x92\xE9\x93\x9C'
 1           column=lol:name, timestamp=1610613495247, value='\xE5\x88\xAB\xE5\x8A\xA8\xE6\x88\x91\xE8\xBE\x85\xE5\x8A\xA9'
 2           column=cf:gun, timestamp=1610613495247, value='AWM'
 2           column=cf:name, timestamp=1610613495247, value='\xE7\x8B\x99\xE5\x87\xBB\xE6\x89\x8B'
 2           column=lol:level, timestamp=1610613495247, value='\xE9\xBB\x91\xE9\x93\x81'
 2           column=lol:name, timestamp=1610613495247, value='\xE5\x88\xAB\xE5\x8A\xA8\xE6\x88\x91BUFF'
2 row(s)

在Hbase插入数据时,同样在Hive中也能查询到新数据

6.使用Hive删除批量Hbase数据

思路:

方法一:

通过建映射表,比如在 hive 建一个映射表,然后写 hql 查出需要删除的 rowkey ,拼成删除命令(deleteall ‘tablename’, rowkey),写到文本 del_temp.txt ;然后执行 hbase shell del_temp.txt

方法二:

通过建映射表,比如在 hive 建一个映射表,将需要保留的数据 通过 hql 查询出来,备份到 hive 的一张临时表 ;然后 在hbase shell 里面 执行 truncate ‘tablename’ ,清空 hbase 的数据; 最后 在将数据 从 hive 的备份表 读出来,插入 映射表,写回 hbase;

这种方法是需要利用Hive的mapreduce操作的

操作:

这里是方法一的操作 即 拼成Hbase命令执行

1.记录hive查询要删除的数据,拼成命令

hive -e "select concat('deleteall \'game\',\'',id,'\'') 
from hive_hbase_game where level = '青铜'"
 > /tmp/del_temp.txt && echo 'exit' >> /tmp/del_temp.txt

2.hbase shell 执行删除命令

hbase shell /tmp/del_temp.txt > del.log
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐