用Hive、Impala查询Hbase数据

15 篇文章 2 订阅
3 篇文章 0 订阅

近期有项目需要向Hbase写入数据,为了测试数据写入是否正常,常用Hbase shell查询数据,但是用起来比较麻烦,看到Clouder官网有关于使用Impala查询Hbase的操作说明,做了简单的尝试,记录如下,供大家参考。

环境:

CDH 5.10.2、Impala 2.7.0、Hive 1.1.0、Hbase 1.2.0

原理:

Hive创建外部表,建立与Hbase表的映射关系,从而实现通过Hive查询Hbase的功能。而Impala与Hive公用元数据信息,因此用Impala也可以查询Hbase.

步骤:

1、修改Cloudera集群中 Impala和Hive配置。

 

2、新建Hbase表,并插入数据。

新建Hbase表有多种方法,如Java API、Python API、Hbase Shell等,以下是通过Hbase Shell新建Hbase表的命令。

create 'examuser_info_tag',{NAME => 'user_info', COMPRESSION => 'SNAPPY' },{NAME => 'tag_info', COMPRESSION => 'SNAPPY' },{NAME => 'ill_tag', COMPRESSION => 'SNAPPY' },{ NUMREGIONS => 10 , SPLITALGO => 'UniformSplit'}

这里不再对插入数据进行说明。

 

3、创建Hive外部表,建立与Hbase的关联关系。

以下SQL需要在Hive Shell中执行。如果使用Hue,注意选择Hive shell,不要使用Impala Shell。

Hive表中的列第一列对应Hbase表中的rowkey,其他列分别对应Hbase表中的列。

CREATE EXTERNAL TABLE hbase.user_info ( 
    idcard STRING,
    checkcount INT, 
    username STRING, 
    useraddr STRING, 
    userbirth STRING, 
    usermarried TINYINT, 
    usersex TINYINT, 
    mincheckdate STRING, 
    mobile STRING
) 
STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" 
WITH SERDEPROPERTIES (
"hbase.columns.mapping"="
    :key,
    user_info:checkCount,
    user_info:userName,
    user_info:userAddr,
    user_info:userBirth,
    user_info:userMarried,
    user_info:userSex,
    user_info:minCheckDate,
    user_info:mobile
") 
TBLPROPERTIES ("hbase.table.name"="user_info")

 

4、Impala同步Hive元数据信息。

在Impala Shell中执行 INVALIDATE METADATA hbase.user_info;

 

5、使用测试

插入数据:

insert into hbase.user_info(idcard,checkcount,username,useraddr,usersex,mobile)
values('12345678777',2,'测试','北京朝阳',1,'1234567890' );

查询:

-- 主键rowkey查询,效率较高
select * from  hbase.user_info  where idcard = '12345678777';

-- 非主键查询,效率很低
select * from  hbase.user_info  where mobile = '1234567890';

删除和修改:

Impala或Hive不支持修改和删除Hbase数据,不过可以使用新插入数据代替Update。

-- 不支持Upate操作
update hbase.user_info set checkcount =3 where idcard = '12345678777';

-- 可以使用如下操作代替Update,
insert into hbase.user_info(idcard,checkcount) values ('12345678777', 3);


批量导入数据:

insert into hbase.user_info( useridcard,checkcount,user,useraddr,userbirth,usermarried,usersex,mincheckdate,mobile)
select useridcard,check_count,user,useraddr,userbirth,usermarried,usersex,min_check_date,mobile 
from test.user_info

上述操作可能会有如下错误信息:

RetriesExhaustedWithDetailsException: Failed 1024 actions: RegionTooBusyException: 1024 times,

这个问题是由于hbase在加载数据过程中产生了region split操作,会阻塞写入操作。可以尝试在创建hbase表时进行优化,如:预建分区。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值