我们正在使用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)
有人可以帮助我吗?