近期有项目需要向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表时进行优化,如:预建分区。