Hbase集群间数据复制

10.2 快照

除了实时备份之外,定期备份归档也是数据库系统保证数据可靠性或者容灾恢复的重要手段。例如,生成环境中程序出现bug,需要用最近的一个备份来恢复数据,一般DBA都会对数据库做定期备份,如一周一次全量备份、一天一次增量备份,快照(snapshot)就提供了一个很好的全量备份的方式。

一个快照是系统在某一时刻的数据的一个完整镜像。快照最简单的实现方式就是对系统加写锁,然后复制出一个数据的备份,这样这个数据的备份就会是某一时刻完全一致性的数据。因为需要加写锁,所以制作镜像的过程系统只能提供数据读操作,等数据复制完成之后才能释放写锁。当数据量大时,数据复制备份必定会花费大量时间,对系统性能影响巨大,这种实现方式对于在线实时系统是无法容忍的。

HBase快照可以让你对HBase表做一个镜像,在常数时间内完成,并且对分区服务器几乎没什么影响,快照记录了该时刻所有的数据,快照的克隆以及恢复操作不会涉及数据的复制,同样,将快照导出到另外一个集群也不会影响到分区服务器。

快照之所以能在常数时间内完成,是因为它只是一组元数据(metadata)的集合。这些元数据描述了快照制作时表所用到的HFile的文件名,因为HFile生成后是不会修改的,只有在进行主压缩(compact)或者拆分(split)的时候才可能会对HFile进行删除操作,所以快照制作完成后只需要提醒系统在compact或者split的时候不删除这些HFile即可。

10.2.1 配置快照

启用HBase快照配置非常简单,只需在hbase-site.xml中添加代码清单10-7所示的配置项即可。代码清单10-7 配置集群支持快照

  hbase.snapshot.enabled

  true

10.2.2 管理快照

HBase提供了Java API和HBase Shell两种方式来管理快照,使用简单。本节介绍如何使用HBase Shell来管理快照。

1.制作快照

无论HBase表是否在线,我们都可以制作表的快照。注意,HBase的新写入的数据先写入MemStore,可能还未刷新到磁盘落地到HFile,因此制作快照的时候也需要把MemStore里面的这部分数据先刷新到HFile,也就是说需要将MemStore刷新成HFile(这里就涉及需要将MemStore加锁禁止写入),然后将HFile路径记录下来。如果能够容忍MemStore里面这部分数据被排除在这个快照之外,则可以使用SKIP_FLUSH参数来省略刷新MemStore到HFile文件的操作。代码清单10-8分别演示了使用与不使用SKIP_FLUSH对用户行为数据表s_behavior制作快照。代码清单10-8 制作快照

hbase(main):026:0* snapshot 's_behavior', 's_behaviorSnapshot-201801281223'

0 row(s) in 0.3500 seconds

hbase(main):028:0> snapshot 's_behavior', 's_behaviorSnapshot-201801281224' ,

{SKIP_FLUSH => true}

0 row(s) in 0.3150 seconds

2.查看快照

与其他HBase Shell命令(如list和list_peer)类似,list_snapshots可以查看HBase集群所有已经创建的快照,代码清单10-9列出了前面创建的两个快照。代码清单10-9 查看快照

hbase(main):030:0> list_snapshots

SNAPSHOT              TABLE + CREATION TIME

s_behaviorSnapshot-201801281223    s_behavior (Sun Jan 28 12:15:40 +0800 2018)

s_behaviorSnapshot-201801281224    s_behavior (Sun Jan 28 12:16:44 +0800 2018)

2 row(s) in 0.0330 seconds

=> ["s_behaviorSnapshot-201801281223", "s_behaviorSnapshot-201801281224"]

3.删除快照

删除快照同样不涉及HFile数据文件的操作,因此同样在常数时间可以完成,代码清单10-10删除了名为s_behaviorSnapshot-201801281224的快照。代码清单10-10 删除快照

hbase(main):031:0> delete_snapshot "s_behaviorSnapshot-201801281224"

0 row(s) in 0.0310 seconds

4.从快照克隆表

快照创建后可以创建一个新表,新表的数据与快照镜像时刻的数据一模一样,并且新表的数据变更不会影响到快照以及旧表,如代码清单10-11所示,用快照s_behaviorSnapshot- 201801281223克隆出新表s_behavior_clone。代码清单10-11 克隆表

hbase(main):033:0> clone_snapshot 's_behaviorSnapshot-201801281223','s_behavior_clone'

0 row(s) in 0.3900 seconds

5.从快照恢复数据

恢复操作需要将HBase表下线,恢复后表的状态会回滚到快照创建时刻,包括数据和表模式(schema)都会被回滚,如代码清单10-12所示。代码清单10-12 快照恢复

hbase(main):035:0> disable 's_behavior'

0 row(s) in 2.2770 seconds

hbase(main):036:0> restore_snapshot 's_behaviorSnapshot-201801281223'

0 row(s) in 0.2710 seconds

6.将快照导出到其他集群

HBase提供了一个ExportSnapshot工具类用来将快照复制到另外一个集群。复制的数据包括HFile、HLog以及快照元数据。类似于distcp,这个工具类是一个基于文件复制的MapReduce作业(执行之前需要先启动Hadoop ResourceManager和NodeManager),因此HBase集群无须下线,但是当数据量较大时,需要消耗一定的资源。

代码清单10-13使用16个线程将快照s_behaviorSnapshot-201801281223导出到HBase集群cluster2。代码清单10-13 快照导出

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot s_behaviorSnapshot

-201801281223 -copy-to hdfs://cluster2:8082/hbase -mappers 16

导出快照数据涉及数据传输,可能占用大量带宽,该工具类可接收参数-bandwidth以限定导出命令消耗的最大带宽(单位MB/s),如代码清单10-14所示。代码清单10-14 快照导出限制带宽

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot s_behaviorSnapshot

-201801281223 -copy-to hdfs://cluster2:8082/hbase -mappers 16

-bandwidth 200

10.3 导出和导入

HBase提供了Export MapReduce作业用来把HBase的表导出(export)为文件,然后使用Import MapReduce作业来把文件导入(import)同一个或者另外一个集群的HBase表中。导出和导入涉及数据的读取、传输,因此对性能影响相对较大,一般在离线集群使用,因为导入导出需要使用到MapReduce作业,所以需要在Hadoop集群使用如下命令启动ResourceManager和NodeManager:

/home/hadoop/hadoop-2.6.5/sbin/yarn-daemon.sh start resourcemanager

/home/hadoop/hadoop-2.6.5/sbin/yarn-daemon.sh start nodemanager

10.3.1 导出

HBase Export命令参数较多,先看下代码清单10-15所示的使用说明。代码清单10-15 导出命令说明

[hadoop@master1 root]$ hbase org.apache.hadoop.hbase.mapreduce.Export

ERROR:Wrong number of arguments:0

Usage:Export [-D ]* [ [

[]] [^[regex pattern] or [Prefix] to filter]]

 Note:-D properties will be applied to the conf used.

 For example:

  -D mapreduce.output.fileoutputformat.compress=true

  -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.

GzipCodec

  -D mapreduce.output.fileoutputformat.compress.type=BLOCK

 Additionally, the following SCAN properties can be specified

 to control/limit what is exported..

  -D hbase.mapreduce.scan.column.family=

  -D hbase.mapreduce.include.deleted.rows=true

  -D hbase.mapreduce.scan.row.start=

  -D hbase.mapreduce.scan.row.stop=

For performance consider the following properties:

  -Dhbase.client.scanner.caching=100

-Dmapreduce.map.speculative=false

  -Dmapreduce.reduce.speculative=false

For tables with very wide rows consider setting the batch size as below:

  -Dhbase.export.scanner.batch=10

1.导出整个表

(1)导出到HBase所在HDFS。默认情况下导出的文件会保存到HBase数据存储的Hadoop集群的HDFS目录,如下代码将表s_behavior导出到HDFS目录/home/hadoop/s_behavior:

hbase org.apache.hadoop.hbase.mapreduce.Export 's_behavior' /home/hadoop/s_behavior

使用如下Hadoop fs命令可以查看导出的文件:

[hadoop@master1 ~]$ hadoop fs -ls /home/hadoop

Found 1 items

drwxr-xr-x  - hadoop supergroup  0 2017-11-13 19:23 /home/hadoop/s_behavior

(2)导出到指定HDFS。使用如下命令可以将文件导出到目标HDFS集群,以方便导入:

hbase org.apache.hadoop.hbase.mapreduce.Export 's_behavior'

hdfs://master1:9000/home/hadoop/s_behavior

(3)导出到本地文件。使用如下命令可以将文件导出到本地文件,以方便复制备份:

hbase org.apache.hadoop.hbase.mapreduce.Export 's_behavior'

file:///home/hadoop/s_behavior

2.按时间区间导出

如果只需要导出表在某个时间范围内的数据以用作离线分析,则可以指定导出数据的开始和结束时间。如下命令导出s_behavior表数据版本为1,时间区间在0<=时间戳< 1505959355000的数据:

hbase org.apache.hadoop.hbase.mapreduce.Export 's_behavior' /home/hadoop/s_behavior_

time 1 0 1505959355000

10.3.2 导入

导入命令相对简单,代码清单10-16列出了Import命令使用说明。代码清单10-16 导入命令说明

[hadoop@wxmaster1 root]$ hbase org.apache.hadoop.hbase.mapreduce.Import

ERROR:Wrong number of arguments:0

Usage:Import [options]

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

To apply a generic org.apache.hadoop.hbase.filter.Filter to the input, use

 -Dimport.filter.class=

 -Dimport.filter.args=

NOTE:The filter will be applied BEFORE doing key renames via the HBASE_IMPORTE

R_RENAME_CFS property.Futher, filters will only use the Filter#filterRowKey(byt

e[] buffer, int offset, int length) method to identify whether the current row

needs to be ignored completely for processing and Filter#filterKeyValue(KeyValue)

method to determine if the KeyValue should be added; Filter.ReturnCode#INCLUDE

E and #INCLUDE_AND_NEXT_COL will be considered as including the KeyValue.

To import data exported from HBase 0.94, use

 -Dhbase.import.version=0.94

For performance consider the following options:

 -Dmapreduce.map.speculative=false

 -Dmapreduce.reduce.speculative=false

 -Dimport.wal.durability=

the supported durability values like SKIP_WAL/ASYNC_WAL/SYNC_WAL/……>

如下两行命令分别将HBase集群所在的HDFS文件/home/hadoop/s_behavior和本地文件/home/hadoop/s_behavior_local导入到表s_behavior_import。注意导入之前需要确保表s_behavior_import已经存在:

hbase org.apache.hadoop.hbase.mapreduce.Import 's_behavior_import' /home/hadoop/s_behavior

hbase org.apache.hadoop.hbase.mapreduce.Import 's_behavior_import'

file:///home/hadoop/s_behavior_local

10.4 复制表

HBase CopyTable支持同一个集群中不同表之间数据的复制,也可以将一个集群中表的数据复制到另一个集群的表,复制之前需要先创建表,复制表也是一个MapReduce任务,因此执行之前需要先启动Hadoop ResourceManager和NodeManager。

代码清单10-17列出了CopyTable命令使用说明。代码清单10-17 复制表命令说明

[hadoop@wxmaster1 root]$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable

Usage:CopyTable [general options] [——starttime=X] [——endtime=Y] [——new.name=NEW]

[——peer.adr=ADR]

Options:

rs.class   hbase.regionserver.class of the peer cluster

       specify if different from current cluster

rs.impl   hbase.regionserver.impl of the peer cluster

startrow   the start row

stoprow   the stop row

starttime  beginning of the time range (unixtime in millis)

       without endtime means from starttime to forever

endtime   end of the time range. Ignored if no starttime specified.

versions   number of cell versions to copy

new.name   new table's name

peer.adr   Address of the peer cluster given in the format

       hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent

families   comma-separated list of families to copy

       To copy from cf1 to cf2, give sourceCfName:destCfName.

       To keep the same name, just give "cfName"

all.cells  also copy delete markers and deleted cells

bulkload   Write input into HFiles and bulk load to the destination table

Args:

tablename  Name of the table to copy

Examples:

To copy 'TestTable' to a cluster that uses replication for a 1 hour window:

$ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable ——starttime=1265875194289

——endtime=1265878794289 ——peer.adr=server1,server2,server3:2181:/hbase –families

=myOldCf:myNewCf,cf2,cf3 TestTable

For performance consider the following general option:

 It is recommended that you set the following to >=100.A higher value uses more

memory but

 decreases the round trip time to the server and may increase performance.

  -Dhbase.client.scanner.caching=100

 The following should always be set to false, to prevent writing data twice,

which may produce

 inaccurate results.

  -Dmapreduce.map.speculative=false

(1)同集群复制表到新表。下面的命令将s_behavior表复制到新表s_behavior_copy:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable ——new.name=s_behavior_copy 

s_behavior

(2)复制到其他集群。下面的命令将s_behavior表复制到集群ZooKeeper地址为omaster1,omaster2,oslave1:2181的新表s_behavior_copy:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable ——peer.adr=omaster1,omaster2,

oslave1:2181:/hbase ——new.name=s_behavior_copy s_behavior

(3)按时间区间复制。下面的命令将s_behavior表满足条件(1510484706537<=时间戳<1510484750672)的数据复制到集群ZooKeeper地址为omaster1,omaster2, oslave1:2181的新表s_behavior_copy:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable ——starttime=1510484706537

——endtime=1510484750672 ——peer.adr=omaster1,omaster2,oslave1:2181:/hbase

——new.name=s_behavior_copy s_behavior

你可能感兴趣的:(Hadoop)