配置单元hbase快照查询结果无法插入到新表中

tag5nh1u  于 2021-06-09  发布在  Hbase
关注(0)|答案(0)|浏览(347)

我们使用的是cdh 5.16.1、hbase-1.2.0和hive 1.1.0
目标是我想加快将一些数据从hbase保存到hive的速度。默认情况下,我使用了hbastoragehandler,但是它非常慢,因为它使用了请求hbase区域服务器的完全扫描。所以我尝试绕过区域服务器来查询hbase,直接从下划线文件中访问数据。
当我用snapshot查询hbase时,它至少比以前快了6倍。但是,我无法将数据写入配置单元表,除了行键之外,所有字段都为空。

drop table if exists test;
create table test as select * from default.hbase_user_data_snapshot1_table;

但是,如果不使用快照,hbastoragehandler可以成功地将数据加载到新的配置单元表中。
以下是我采取的步骤:
首先,我创建了一个hbase表:

create 'user_data_table','personal_data','professional_data';

然后我在表中插入了几条记录

put 'user_data_table','user1','personal_data:Location','IL'
put 'user_data_table','user1','personal_data:FName','Deb'
put 'user_data_table','user1','personal_data:LName','D'
put 'user_data_table','user1','professional_data:dept','IT'
put 'user_data_table','user1','professional_data:salary','2000'

put 'user_data_table','user2','personal_data:FName','CH'
put 'user_data_table','user2','personal_data:LName','AK'
put 'user_data_table','user2','professional_data:dept','IT'
put 'user_data_table','user2','professional_data:salary','80000'

然后我指定snapshot.name使配置单元查询hbase绕过hbase服务器,直接访问底层文件。

set hive.hbase.snapshot.name=snapshot-day-1;
set hive.hbase.snapshot.restoredir=/tmp;

CREATE EXTERNAL TABLE if not exists default.hbase_user_data_snapshot1_table1(key string, Location string,FName string,LName string, dept string, salary string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,personal_data:Location,personal_data:FName,personal_data:LName,professional_data:dept,professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "user_data_table");

最后,当我尝试将查询结果加载到配置单元表(如下所示)时,结果很奇怪,除了行键之外,所有字段的值都为null。


# show hbase table data

hive> select * from default.hbase_user_data_snapshot1_table;
OK
user1   IL  Deb D   IT  2000
user2   NULL    CH  AK  IT  80000
Time taken: 0.199 seconds, Fetched: 2 row(s)

# load the query result into new table

hive> create table test as select * from default.hbase_user_data_snapshot1_table;

.... OK

# but all the value of  fields are NULL ,expect the row key.

hive> select * from test;
OK
user1   NULL        NULL    NULL    NULL
user2   NULL        NULL    NULL    NULL

我还尝试在不使用参数“set hive.hbase.snapshot.name”的情况下加载数据,现在它会像我预期的那样将查询结果插入表中(但是这样做非常慢,因为hbasestoragehandler使用hbase服务器api查询具有完全扫描的hbase)

CREATE EXTERNAL TABLE if not exists default.hbase_user_data_snapshot1_table1(key string, Location string,FName string,LName string, dept string,salary string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,personal_data:Location,personal_data:FName,personal_data:LName,professional_data:dept,professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "user_data_table");

 create table test1 as select * from default.hbase_user_data_snapshot1_table;

select * from test1;
OK
user1   IL  Deb D   IT  2000
user2   NULL    CH  AK  IT  80000
the snapshot feature link:

我还尝试在tblproperty中指定hive.hbase.snapshot.name,但是配置单元查询请求hbase region服务器api,而不是直接访问下划线文件。我查看了hbasestoragehandler源代码,它通过判断hive conf属性(hiveconf.confvars.hive\u hbase\u snapshot\u name)来选择是否使用hbasesnapshot
因此,如果在任何其他位置指定hive.hbase.snapshot.name,则hive将无法使用snapshot查询hbase。我还将所有hdfs dir权限都更改为777,但它仍然无法将数据插入配置单元表,只是我没有使用快照。奇怪的是,我检查了调试日志,但没有任何错误。
我在想也许这是一个关于这个功能的错误(快照功能链接:https://issues.apache.org/jira/browse/hbase-8369)
有人能帮我吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题