HBase备份与恢复

1, hbase自带的备份恢复工具 
hbase org.apache.hadoop.hbase.mapreduce.Export 'table1' /home/fred/table1 
hbase org.apache.hadoop.hbase.mapreduce.Import 'table1' /home/fred/table1 
导入时必须先创建表结构。 

http://www.iteye.com/topic/1114721 

  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)    




2, 把某个表(table1)从集群1迁移到集群2(两个集群互相看不见),步骤如下 
  1、拷贝集群1的表文件到本地磁盘,拷贝之前要停掉集群1的hbase服务,否则会丢失数据 
hadoop fs -copyToLocal /hbase/table1 /home/fred/hb_bak/table1 

  2、对于文件操作,很简单吧,随便你怎么去拷贝来拷贝去 
  3、如果集群2中也有对应的表文件,那么删除掉,然后拷贝  
hadoop fs -rmr /hbase/table1  
hadoop fs -copyFromLocal /home/fred/hb_bak/table1 /hbase/table1  
  4、到hbase的bin目录下,重置该表在.META.表中的分区信息 
hbase org.jruby.Main add_table.rb /hbase/table1  
  5、重启hbase使表的重置信息生效,切忌强制停掉hbase服务,否侧损坏数据 

另外: 
  1、如果表的数据量过大呢? 那么按照该表在HDFS中的文件夹数据,分批拷贝。 
  2、如果两个集群可以互相通信呢?那么更爽了,直接使用distcp对拷,是并行的。 

3, HBase Backup Options 
http://hbase.info/tag/distcp 
如果你打算部署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中的数据是有多份拷贝的,你也可以把这多份的拷贝当作一种备份,它虽然不能防止数据损坏,但能容忍部分硬件故障。

posted on 2013-03-26 15:07  kobe_tim  阅读(279)  评论(0编辑  收藏  举报

导航