• 沒有找到結果。

3.1 元数据备份恢复说明

3.1.4 HBase 数据

当前HBase上可以使用的数据备份方式主要有以下几种方式,本指导为您介绍通过以 下几种方式进行HBase数据导出、HBase数据导入的操作步骤。

● Snapshots

● Replication

● Export

● CopyTable

● HTable API

● Offline backup of HDFS data

表3-1分别从操作对集群的性能影响、数据空间消耗、业务中断影响、增量备份、易用 of HDFS data 录(默认为/hbase)生成“ .hbase-snapshot”目录,里面有每个快照的详细信息。当 执行ExportSnapshot导出快照时,会在本地提交MR任务,将快照信息以及表的HFile

snapshot 'member','member_snapshot' 步骤2 将快照拷贝到备集群上。

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'

说明

– 使用replication有有别于其他几种数据备份导入方式,当配置了集群间的主 备关系后,数据可以实时同步(无需人为操作)。

– 对于开启表replication同步之前,主集群就已经存在的数据无法同步,需要 借助其他方式导入的备集群。

– bulkload方式写入到主集群的数据无法同步(MRS上的HBase对replication做 了增强,支持bulkload on replication)。

具体的使用和配置方法请参考配置HBase备份和使用ReplicationSyncUp工具来进行

● 该方式数据备份的优点:

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 主集群执行完之后可以在备集群上查看生成的目录数据如图3-1。

3-1 目录数据

步骤2 执行create命令在备集群上新建与主集群相同结构的表,例如member_import。

步骤3 执行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为从主集群上导出的数据目录 步骤4 执行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/

● 该方式数据备份的优点:

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开发以及因此对生产集群带来的影响有深 入的理解。应用程序开发详情请参考MRS开发指南。

Offline backup of HDFS data

离线备份HDFS数据,即关闭HBase服务并手工在HDFS上拷贝数据。

● 该方式数据备份的优点:

– 可以把主集群上所有数据(包含元数据)整个复制到备集群。

– 由于是通过distcp直接拷贝的,所以数据备份的效率相对较高。

– 实际操作时可以根据具体的需求灵活拷贝,可以只拷贝其中一个表的数据,

也可以拷贝region中的其中一个hfile等。

● 该方式数据备份的缺点和限制:

– 此操作会覆盖备集群上的HDFS的数据目录。

– 如果主备集群间的HBase版本不同,HDFS目录直接拷贝可能会出现问题,例 如MRS上的hbase1.3版本新增了系统表index,如果使用老版本的HDFS目录 直接覆盖,会找不到该数据表。所以此种方案在执行前需要慎重考虑。

– 此操作对用户使用HBase的能力有一定的要求,如出现异常情况需要根据实 际情况执行恢复。

在主集群执行如下操作:

步骤1 执行如下命令将当前集群内存中的数据持久化到HDFS中。

flush 'tableName' 步骤2 停止HBase服务。

步骤3 使用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里面的数据可能还有被 数据目录所引用。

----结束

在备集群执行如下操作:

步骤1 重启HBase服务,使数据迁移生效。在启动过程中,HBase会加载当前HDFS上的数据 并重新生成元数据。

步骤2 启动完成后,在Master节点客户端执行如下命令加载HBase表数据。

$HBase_Home/bin/hbase hbck -fixMeta -fixAssignments

步骤3 命令执行完成后,重复执行如下命令查看HBase集群健康状态直至正常。

hbase hbck 说明