【hbase】HBase 定期备份

Author:Pirate Leo

myBlog: http://blog.csdn.net/pirateleo/

myEmail: codeevoship@gmail.com

转载请注明出处,谢谢。

文中可能涉及到的API:

Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/

HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html

Begin!


一、概述

使用了HBase提供的Export与Import工具。

Export:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/Export.html

Import:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/Import.html

看到这两个类所在目录我们了解到,Export与Import的实质是MapReduce任务。

关于这两个工具API中写的很清楚:

Export an HBase table. Writes content to sequence files up in HDFS. Use Import to read it back in again.

将HBase的表导出为HDFS的sequence files。

Export如其名,只是导出工具,如何完成备份功能呢?


二、功能实验

测试过程涉及很多数据,这里仅提供重要结论:

1、Export是以表为单位导出数据的,若想完成整库的备份需要执行n遍。

2、Export在shell中的调用方式类似如下格式:

./hbase org.apache.hadoop.hbase.mapreduce.Export 表名 备份路径 (版本号) (起始时间戳) (结束时间戳) 

Export [-D <property = value>]* <tableName> <outputDir> [<versions> [<startTime> [<endTime>]]]

括号内为可选项,例如

./hbase org.apache.hadoop.hbase.mapreduce.Export 'contentTbl' /home/codeevoship/contentBackup20120920 1 123456789

备份contentTbl这张表到/home/codeevoship/contentBackup20120920目录下(最后一级目录必须由Export自己创建),版本号为1,备份记录从123456789这个时间戳开始到当前时间内所有的执行过put操作的记录。

注意:为什么是所有put操作记录?因为在备份时是扫描所有表中所有时间戳大于等于123456789这个值的记录并导出。如果是delete操作,则表中这条记录已经删除,扫描时也无法获取这条记录信息。

3、当不指定时间戳时,备份的就是当前完整表中的数据。


三、实施细节

1、如何在增量备份时体现出对数据的删除操作?

由于Export按时间戳备份只能反映出Put过的表项,若我在一个备份(增量包)时间区间内删除了某条已有记录,当数据库回档时,这条被删除的记录又会出现在我的表中。

因此,我将所有的删除操作替换为Put操作:

a、给每行数据添加了一个无效标志位,在删除记录时使用Put给该标志位写为1。

b、在单条查询时,根据rowKey取出记录后会根据这个标志位判断这条记录是否已被“删除”,以此决定是否返回这条记录。在多条查询时(scan),使用列值过滤器,过滤出所有这个标志位不为1的记录。(可参见我之前的博文《HBase 条件查询》)

2、在备份过程中新增的数据是否会影响备份内容的准确性?

可以指定小于等于当前时刻的结束时间戳,以便将需要备份的数据范围明确。

3、如何备份到其他机器?

a、Export支持提供地址的备份。最简单的方法,直接把远端存储挂载到本地,然后使用本地路径。

b、使用API调用时,Path如果使用file:///home/codeevoship/backup,代表使用本地文件系统。若直接写为/home/codeevoship 代表使用HDFS层的路径。在使用Shell调用时则相反。

4、如何使用API调用?

通过MapReduce的Job:http://hadoop.apache.org/docs/r0.20.2/api/org/apache/hadoop/mapreduce/Job.html

先通过Export类提供的方法创建Job实例,再调用Job的submit()waitForCompletion(boolean verbose);异步与同步。


四、其他解决方案

1、HDFS层的HDFS Replication或DistCp

2、Cluster Replication


转载一份使用Export与Import定期备份的Python代码。每月15日做一次完整备份,每天进行一次增量备份。

[python]  view plain copy print ?
  1. import time    
  2. import datetime    
  3. from datetime import date    
  4. import sys    
  5. import os    
  6.     
  7. tablename=sys.argv[1]    
  8. backupDst=sys.argv[2]    
  9. today=date.today()    
  10. if today.day == 15:    //every month, we do a full backup    
  11.         backupSubFolder=backupDst+today.isoformat()+"-full"    
  12.         cmd="hbase org.apache.hadoop.hbase.mapreduce.Export %s %s"%(tablename,backupSubFolder)    
  13. else:    
  14.     
  15.         yesterday=datetime.date.today()- datetime.timedelta(days=1)    
  16.         todayTimeStamp=time.mktime(today.timetuple())    
  17.         yesTimeStamp=time.mktime(yesterday.timetuple())    
  18.         backupSubFolder=backupDst+today.isoformat()    
  19.         cmd="hbase org.apache.hadoop.hbase.mapreduce.Export %s %s %s"%(tablename,backupSubFolder,str(int(todayTimeStamp)*1000)    
  20.     
  21. print cmd    
  22.     
  23. os.system(cmd)  

注意最后的cmd字符串构建,视HBase版本在对应位置添加上版本号。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值