HBase 备份和恢复

(转载)hbase备份恢复


hbase本身提供的接口

Usage: Import [options] <tablename> <inputdir>
By default Import will load data directly into HBase. To instead generate
HFiles of data to prepare for a bulk data load, pass the option:
  -Dimport.bulk.output=/path/for/output
For performance consider the following options:
  -Dmapred.map.tasks.speculative.execution=false
  -Dmapred.reduce.tasks.speculative.execution=false

导出

hbase org.apache.hadoop.hbase.mapreduce.Driver export 'tablename' Path/to/dumpfile  <versions>

其中数据文件位置可为本地文件目录,也可以分布式文件系统hdfs的路径。

当其为前者时,直接指定即可,也可以加前缀file:///

而当其为后者时,必须明确指明hdfs的路径,例如hdfs://mymaster:9000/path


另外,该接口类还提供了一些其它的方法,例如表与表之间的数据拷贝,导入tsv文件等,可回车键查看

导入

hbase org.apache.hadoop.hbase.mapreduce.Driver import 'tablename' Path/to/dumpfile

python调用export脚本

import time
import datetime
from datetime import date
import sys
import os
 
tablename=sys.argv[1]
backupDst=sys.argv[2]
today=date.today()
if today.day == 15:    //every month, we do a full backup
    backupSubFolder=backupDst+today.isoformat()+"-full"
    cmd="hbase org.apache.hadoop.hbase.mapreduce.Export %s %s"%(tablename,backupSubFolder)
else:
    yesterday=datetime.date.today()- datetime.timedelta(days=1)
    todayTimeStamp=time.mktime(today.timetuple())
    yesTimeStamp=time.mktime(yesterday.timetuple())
    backupSubFolder=backupDst+today.isoformat()
    cmd="hbase org.apache.hadoop.hbase.mapreduce.Export %s %s %s"%(tablename,backupSubFolder,str(int(todayTimeStamp)*1000)
 
print cmd
os.system(cmd)


表迁移至另一集群

把某个表(table1)从集群1迁移到集群2(两个集群互相看不见),步骤如下

拷贝集群1的表文件到本地磁盘, 拷贝之前要停掉集群1的hbase服务,否则会丢失数据
hadoop fs -copyToLocal /hbase/table1 /home/fred/hb_bak/table1

对于文件操作,很简单吧,随便你怎么去拷贝来拷贝去


如果集群2中也有对应的表文件,那么删除掉,然后拷贝

hadoop fs -rmr /hbase/table1
hadoop fs -copyFromLocal /home/fred/hb_bak/table1 /hbase/table1

到hbase的bin目录下,重置该表在.META.表中的分区信息

hbase org.jruby.Main add_table.rb /hbase/table1

add_table.rb 这个文件在新版本中的HBase中没有了,不过可以从http://svn.apache.org/repos/asf/hbase/branches/former_0.20/bin/add_table.rb 下载,并保存到HBase的bin目录下。


重启hbase使表的重置信息生效,切忌强制停掉hbase服务,否侧损坏数据
另外:
如果表的数据量过大呢? 那么按照该表在HDFS中的文件夹数据,分批拷贝。

如果两个集群可以互相通信呢?那么更爽了,直接使用distcp对拷,是并行的。


HBase Backup Options

http://hbase.apache.org/book/ops.backup.html
如果你打算部署HBase,那么你一定要考虑如何备份的问题,下面是作者列举的他所知道的一些备份方式,如果有遗漏的,欢迎补充。
  • Export
HBase提供了export的MapReduce Job(org.apache.hadoop.hbase.mapreduce.Export)可以将表导出为HDFS的顺序文件(SequenceFile),这是由HBASE-1684贡献的工具。此工具一次只能操作一张表,导出的顺序文件可以通过Import工具导入HBase。
  • Copy Table
在两个HBase集群之间复制数据,也可以通过Copy Table工具,这也是MapReduce实现的,一次操作一张表。
  • Distcp
你也可以利用HDFS的Distcp工具将整个/hbase复制到另外一个HDFS集群,但这可能导致复制的数据不一致,所以尽量不要这么做,除非先将源集群停止服务,参考: http://search-hadoop.com/m/wkMgSjVLDb
  • Backup from Mozilla
由于Dictcp做集群复制存在数据不一致的问题,Mozilla的开发人员开发了一个Backup工具,具体情况请参考他们的这篇Migrating HBase in the Trenches。
  • Cluster Replication
HBase从0.89版本开始引入集群复制功能,所以我们也可以利用此功能将数据备份到另一个集群。复制的目标集群不需要和源集群同配置,因此可以将数据通过复制备份到一个较低成本的集群中。
  • Table Snapshot
在著名的HBase-50中就提出了Snapshot的问题,尽管在GSoC 2010期间做了大量的工作,但不知由于什么原因,一直没有合并进HBase的主流分支。Jira上已经有一个Patch,但已经较长时间无进展了。
  • HDFS Replication
HDFS中的数据是有多份拷贝的,你也可以把这多份的拷贝当作一种备份,它虽然不能防止数据损坏,但能容忍部分硬件故障。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值