Hive操作Hbase(详细配置及操作)
Hive操作Hbase(详细配置及操作)GuideHive操作Hbase(详细配置及操作)前言版本:适用场景开始配置操作1. 创建一张Hbase表2. 在Hive创建一张Hbase的映射表(外部表)3. 创建一张原始表来导入本地数据4. 将原始表数据插入到映射表5. 在Hive&Hbase查询数据6.使用Hive删除批量Hbase数据前言HBase 虽然可以存储数亿或数十亿行数据,但是对于
Hive操作Hbase(详细配置及操作)
Guide
前言
HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说,不太友好,只提供了简单的基于 Key 值的快速查询能力,没法进行大量的条件查询。
不过,Hive 与 HBase 的整合可以实现我们的这个目标。不仅如此,还能通过 Hive 将数据批量地导入到 HBase 中。
Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的,其具体工作交由 Hive 的 lib 目录中的 hive-hbase-handler-xxx.jar 工具类来实现对 HBase 数据的读取。
版本:
组件 | 版本号 |
---|---|
Hadoop | 3.2.0 |
Hive | 3.1.1 |
Hbase | 2.2.6 |
适用场景
Hive 与 HBase 整合的适用场景:
**1、**通过 Hive 与 HBase 整合,可以将 HBase 的数据通过 Hive 来分析,让 HBase 支持 JOIN、GROUP 等 SQL 查询语法。
**2、**实现将批量数据导入到 HBase 表中。
开始配置
-
把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
-
添加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
更多推荐
所有评论(0)