HBase数据
当前HBase上可以使用的数据备份方式主要有以下几种方式,本指导为您介绍通过以下几种方式进行HBase数据导出、HBase数据导入的操作步骤。
- Snapshots
 - Replication
 - Export
 - CopyTable
 - HTable API
 - Offline backup of HDFS data
 
表1分别从操作对集群的性能影响、数据空间消耗、业务中断影响、增量备份、易用性、可恢复性几个维度进行对比。
| 
       备份方式  | 
     
       性能影响  | 
     
       数据空间消耗  | 
     
       业务中断影响  | 
     
       增量备份  | 
     
       易用性  | 
     
       可恢复性  | 
    
|---|---|---|---|---|---|---|
| 
       Snapshots  | 
     
       低  | 
     
       小  | 
     
       短暂中断(仅恢复时)  | 
     
       不支持  | 
     
       易  | 
     
       秒  | 
    
| 
       Replication  | 
     
       低  | 
     
       大  | 
     
       无  | 
     
       固有  | 
     
       中  | 
     
       秒  | 
    
| 
       Export  | 
     
       高  | 
     
       大  | 
     
       无  | 
     
       支持  | 
     
       易  | 
     
       高  | 
    
| 
       CopyTable  | 
     
       高  | 
     
       大  | 
     
       无  | 
     
       支持  | 
     
       易  | 
     
       高  | 
    
| 
       HTable API  | 
     
       中  | 
     
       大  | 
     
       无  | 
     
       支持  | 
     
       难  | 
     
       取决于用户  | 
    
| 
       Offline backup of HDFS data  | 
     
       -  | 
     
       大  | 
     
       长时间中断  | 
     
       不支持  | 
     
       中  | 
     
       高  | 
    
Snapshots
对表执行snapshot操作生成快照,既可以作为原表的备份,当原表出现问题的时候可以回滚恢复,也可以作为跨集群的数据备份工具。执行快照会在当前HBase上的根目录(默认为/hbase)生成“ .hbase-snapshot”目录,里面有每个快照的详细信息。当执行ExportSnapshot导出快照时,会在本地提交MR任务,将快照信息以及表的HFile分别拷贝到备集群的/hbase/.hbase-snapshot和/hbase/archive中。详情请参考http://hbase.apache.org/2.2/book.html#ops.snapshots。
- 该方式数据备份的优点:
    
单表备份效率高,在线数据本地/远程备份,不中断主集群和备集群业务,可以灵活配置map的个数和限制流量,MapReduce的执行节点可不在主备集群(不占资源)。
 - 该方式数据备份的缺点和限制:
 
在主集群执行如下操作:
- 对表创建快照。例如对表member创建快照member_snapshot。
    
    
snapshot 'member','member_snapshot'
 - 将快照拷贝到备集群上。
    
    
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot member_snapshot -copy-to hdfs://备集群HDFS服务主NameNode节点IP:端口号/hbase -mappers 3
- 备集群的数据目录必须为HBASE根目录(/hbase)
 - mappers表示MR任务需要提交的map个数
 
 
在备集群执行如下操作:
使用restore命令在备集群自动新建表,以及与archive里的HFile建立link。
restore_snapshot 'member_snapshot'
 
   如果只是备份表数据的话,建议使用此种方式备份,SnapshotExport会在本地提交MR任务,将Snapshot和HFile拷贝到备集群,之后可以在备集群直接加载数据,效率比其他方式高很多。
Replication
Replication备份是在HBase上建立主备集群的容灾关系,当数据写入主集群,主集群通过WAL来主动push数据到备集群上,从而达到主备集群的实时同步。详情请参考http://hbase.apache.org/2.2/book.html#_cluster_replication。
- 该方式数据备份的优点:
    
- 使用replication有有别于其他几种数据备份导入方式,当配置了集群间的主备关系后,数据可以实时同步(无需人为操作)。
 - 相对而言,“备份”的动作占用集群的资源较少,对集群的性能影响小。
 - 数据同步可靠性较高,如果备集群停止一段时间后再恢复,这中间主机群的数据依然会同步到备集群。
 
 - 该方式数据备份的缺点和限制:
    
- 如果客户端写入的数据设置不写WAL,则数据无法备份到备集群。
 - 由于占用的资源少,后台是通过异步的方式同步数据,实际数据没有实时同步。
 - 对于开启表replication同步之前,主集群就已经存在的数据无法同步,需要借助其他方式导入的备集群。
 - bulkload方式写入到主集群的数据无法同步(MRS上的HBase对replication做了增强,支持bulkload on replication)。
 
 
具体的使用和配置方法请参考配置HBase备份和使用ReplicationSyncUp工具来进行备份数据。
Export/Import
Export/Import主要是启动MapReduce任务对数据的表进行扫描(scan),往远端HDFS写入SequenceFile,之后Import再把SequenceFile读出来写入HBase(put)中。
- 该方式数据备份的优点:
    
在线拷贝不中断业务,由于是scan->put的方式写入新表,所以比CopyTable更加灵活,可灵活配置需要获取的数据,数据可增量写入。
 - 该方式数据备份的缺点和限制:
    
由于Export是通过MapReduce任务往远端HDFS写入SequenceFile,之后Import再把SequenceFile读出来写入HBase,需要执行两次MapReduce任务,实际效率不高。
 
在主集群执行如下操作:
执行Export命令导出表。
hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir>
例如:hbase org.apache.hadoop.hbase.mapreduce.Export member hdfs://备集群HDFS服务主NameNode节点IP:端口号/user/table/member
其中,member为待导出表的名称。
在备集群执行如下操作:
- 主集群执行完之后可以在备集群上查看生成的目录数据如图1。
 - 执行create命令在备集群上新建与主集群相同结构的表,例如member_import。
 - 执行Import命令生成HFile数据在HDFS上。
    
    
hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
例如:hbase org.apache.hadoop.hbase.mapreduce.Import member_import /user/table/member -Dimport.bulk.output=/tmp/member
- member_import为备集群上与主集群相同表结构的表
 - Dimport.bulk.output为输出的HFile数据目录
 - /user/table/member为从主集群上导出的数据目录
 
 - 执行Load操作将HFile数据写入HBase。
    
    
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/member member
- /tmp/member为3中HFile数据的输出目录
 - member为备集群上要导入数据的表名
 
 
CopyTable
拷贝表功能与导出功能类似,拷贝表也使用HBase API创建了一个MapReduce任务,以便从源表读取数据。不同的地方是拷贝表的输出是hbase中的另一张表,这张表可以在本地集群,也可以在远程集群。详情请参考http://hbase.apache.org/2.2/book.html#copy.table。
在备集群执行如下操作:
执行create命令在备集群上新建与主集群相同结构的表,例如member_copy。
在主集群执行如下操作:
执行CopyTable的命令拷贝表。
hbase org.apache.hadoop.hbase.mapreduce.CopyTable [--starttime=xxxxxx] [--endtime=xxxxxx] --new.name=member_copy --peer.adr=server1,server2,server3:2181:/hbase [--families=myOldCf:myNewCf,cf2,cf3] TestTable
- starttime/endtime为待拷贝数据的时间戳。
 - new.name为备集群中目的表的表名,默认为和原来表名相同。
 - peer.adr为备集群zookeeper节点的信息,格式为quorumer:port:/hbase。
 - families为待拷贝的表的family列。
 
 
   如果是拷贝数据到远端集群,此种方式导入数据会在主机群上提交MapReduce任务,读取原始表的全量/部分数据之后采用put的方式写入远端集群,所以如果表的数据量很大(远程拷贝不支持bulkload),则效率会比较低。
HTable API
API的方式主要也是在代码中对原始HBase表的数据导入导出,你可以使用公用的API写自己定制的客户端应用程序来直接查询表格,或通过MapReduce任务的批量处理优势自己设计其他方法。该方式需要对Hadoop开发以及因此对生产集群带来的影响有深入的理解。
Offline backup of HDFS data
离线备份HDFS数据,即关闭HBase服务并手工在HDFS上拷贝数据。
- 该方式数据备份的优点:
    
- 可以把主集群上所有数据(包含元数据)整个复制到备集群。
 - 由于是通过distcp直接拷贝的,所以数据备份的效率相对较高。
 
- 实际操作时可以根据具体的需求灵活拷贝,可以只拷贝其中一个表的数据,也可以拷贝region中的其中一个hfile等。
 
 - 该方式数据备份的缺点和限制:
    
- 此操作会覆盖备集群上的HDFS的数据目录。
 - 如果主备集群间的HBase版本不同,HDFS目录直接拷贝可能会出现问题,例如MRS上的hbase1.3版本新增了系统表index,如果使用老版本的HDFS目录直接覆盖,会找不到该数据表。所以此种方案在执行前需要慎重考虑。
 - 此操作对用户使用HBase的能力有一定的要求,如出现异常情况需要根据实际情况执行恢复。
 
 
在主集群执行如下操作:
- 执行如下命令将当前集群内存中的数据持久化到HDFS中。
    
    
flush 'tableName'
 - 停止HBase服务。
 - 使用distcp命令拷贝当前集群HDFS上的数据到备集群上。
    
    
hadoop distcp -i /hbase/data hdfs://备集群HDFS服务主NameNode节点IP:端口号/hbase
hadoop distcp –update –append –delete /hbase/ hdfs://备集群HDFS服务主NameNode节点IP:端口号/hbase/
第二条命令为增量拷贝除了data目录以外的文件,例如archive里面的数据可能还有被数据目录所引用。
 
在备集群执行如下操作:
- 重启HBase服务,使数据迁移生效。在启动过程中,HBase会加载当前HDFS上的数据并重新生成元数据。
 - 启动完成后,在Master节点客户端执行如下命令加载HBase表数据。
    
    
$HBase_Home/bin/hbase hbck -fixMeta -fixAssignments
 - 命令执行完成后,重复执行如下命令查看HBase集群健康状态直至正常。
    
    
hbase hbck
 
     当用户使用了HBase协处理器,自定义jar包放在主集群的regionserver/hmaster上时,在备集群重启HBase之前,需要把这些自定义jar包也拷贝过来。
 
    
      