Hive HBase快照查询结果无法插入新表

时间:2019-03-26 02:06:45

标签: hive hbase integration snapshot

我们正在使用CDH 5.16.1,hbase-1.2.0,hive 1.1.0

目标是我想加快将某些数据从hbase保存到hive的速度。   默认情况下,我使用了HbaseStorageHandler,但是它非常慢,因为它使用了请求hbase区域服务器的完全扫描。所以我试图查询hbase绕过区域服务器,并直接从下划线文件访问数据。

当我用快照查询hbase时,它至少比以前快了6倍。但是,我无法将数据写入配置单元表,除行键外,所有字段均为空。

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

但是,如果我不使用快照,则HbaseStorageHandler可以成功将数据加载到新的配置单元表中。

这是我采取的步骤:

首先,我创建了一个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以使Hive查询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:
我还尝试在TBLPROPERTIES中指定hive.hbase.snapshot.name,但是 配置单元查询请求Hbase区域服务器API,而不是直接访问下划线文件。 我查看了HbaseStorageHandler源代码,它通过判断hive conf属性(HiveConf.ConfVars.HIVE_HBASE_SNAPSHOT_NAME)选择是否使用HbaseSnapshot

因此,如果您在其他任何地方指定hive.hbase.snapshot.name,它将无法用于hive查询带有快照的hbase。而且我也将所有hdfs dir权限更改为777,但它仍然无法将数据插入到蜂巢表中,除非我不使用快照。 我检查了调试日志很奇怪,但其中没有任何错误。

我在流浪,也许这是关于该功能的错误。 (快照功能链接: https://issues.apache.org/jira/browse/HBASE-8369

有人可以帮助我吗?

0 个答案:

没有答案