我们使用的是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)
有人能帮我吗?
暂无答案!
目前还没有任何答案,快来回答吧!