Hive 表中的 HBase 快照

Posted

技术标签:

【中文标题】Hive 表中的 HBase 快照【英文标题】:HBase Snapshot in Hive table 【发布时间】:2015-08-13 14:02:12 【问题描述】:

我已经创建了一个 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 'user_data_table', 'snapshot-day-1'

然后我插入/更新了如下记录。

put 'user_data_table','user1','personal_data:Location','VA'
put 'user_data_table','user1','professional_data:salary','3000'

当我尝试在我的配置单元表中引用快照时,我没有得到旧数据。相反,我每次都得到最新的数据。知道为什么它会这样。使用 hbase 快照引用创建 hive 表的命令如下。

CREATE EXTERNAL TABLE if not exists hbase_user_data_snapshot1_table(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",
    "hive.hbase.snapshot.name"="snapshot-day-1")
    TBLPROPERTIES ("hbase.table.name" = "user_data_table");

【问题讨论】:

【参考方案1】:

快照意味着 (1) 不会从现有 HFile 中删除任何信息,并且 (2) 这些 HFile 在创建快照时的内容可以按需重建(隐藏任何有已附加)

但是HIVE-6584 声明...

绕过在线区域服务器 API 提供了不错的性能 提升全扫描

...所以也许他们选择“绕过”时间点恢复部分,只是将快照用作直接访问 HFile 的后门。包括自快照创建以来附加的任何内容。也许吧。

【讨论】:

那么在这种情况下,它类似于表中当前存在的内容。有什么地方可以全面了解这一点吗?我搜索了很多,但没有得到任何信息。 当我尝试从快照中恢复表时,它已恢复并且旧数据被还原,但是当我尝试在 hive 表中引用快照时,我没有得到旧数据。 【参考方案2】:

DDL 错误。正确的做法如下。

    CREATE EXTERNAL TABLE if not exists hbase_user_data_snapshot2_table(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 ("hive.hbase.snapshot.name"="snapshot-day-2");

注意 TBLPROPERTIES。我们不引用表,而是引用快照名称。

【讨论】:

【参考方案3】:

您需要在这样选择之前设置 Hive 变量

CREATE EXTERNAL TABLE if not exists hbase_user_data_snapshot2_table(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 ("hive.hbase.table.name"="xxx");

-- a table may be have many snapshot,so we configure it before select,
-- that is make sense
-- and if you snapshot file is store in a special path, please use 
-- SET hive.hbase.snapshot.restoredir= xxxx; to configure 
SET hive.hbase.snapshot.name=snapshot-day-2;
select * from hbase_user_data_snapshot2_table;

【讨论】:

以上是关于Hive 表中的 HBase 快照的主要内容,如果未能解决你的问题,请参考以下文章

创建Hbase表&Hbse表映射到hive表

用idea操作hbase数据库,并映射到hive

建立Hive和Hbase的映射关系,通过Spark将Hive表中数据导入ClickHouse

Hive 整合Hbase

hbase可以访问hive里面的表吗

Presto 无法获取 HIVE 表中的内容