EMR入门学习之HBase数据迁移(九)

2019-11-20 12:39:46 浏览数 (1)

一、简介

HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类:

从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类。下面分别介绍一下。

二、Hadoop层的数据迁移

1、DistCp介绍

DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。

2、使用说明

最常用的使用distcp进行集群间拷贝的命令是:

代码语言:javascript复制
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

在这里我们就不过多的介绍了

三、HBase层数据迁移

1、copyTable方式

copyTable也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。copyTable的本质也是利用MapReduce进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。 来看下copyTable的一些使用参数:

选项

含义

rs.class

对等集群的hbase.regionserver.class,指定是否与当前群集不同

rs.impl

对等集群 hbase.regionserver.impl 的实现类

startrow

起始rowkey

stoprow

终止rowkey

starttime

起始时间 (unix时间 ,单位 millis)

endtime

如果没有则表示到最大 结束时间范围。 如果未指定启动时间,则忽略。

versions

要复制的单元(cells)版本数

new.name

新表的名字

peer.adr

格式中给出的对等集群的地址: hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent

families

以逗号分隔的要复制的族的列表

families

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

families

To keep the same name, just give "cfName"

all.cells

同时复制删除标记和删除的单元格

2、Export/Import方式

此方式与CopyTable类似,主要是将HBase表数据转换成Sequence File并dump到HDFS,也涉及Scan表数据,与CopyTable相比,还多支持不同版本数据的拷贝,同时它拷贝时不是将HBase数据直接Put到目标集群表,而是先转换成文件,把文件同步到目标集群后再通过Import到线上表。

3、Snapshot方式

今天我们的重点主要介绍一下使用快照的方式,快照就是一份元信息的合集,允许管理员恢复到表的先前状态,快照不是表的复制而是一个文件名称列表因不拷贝实际的数据,所以整个过程是比较快的,相当于对表当前元数据状态作一个克隆,snapshot的流程主要有三个步骤:

加锁: 加锁对象是regionserver的memstore,目的是禁止在创建snapshot过程中对数据进行insert,update,delete操作

刷盘:刷盘是针对当前还在memstore中的数据刷到HDFS上,保证快照数据相对完整,此步也不是强制的,如果不刷会,快照中数据有不一致风险

创建指针: snapshot过程不拷贝数据,但会创建对HDFS文件的指针,snapshot中存储的就是这些指标元数据

接下来我们具体来了解一下实施方案:

1.在新集群上建立表结构一样的表

2.使用hbase shell 在老集群中创建一个快照

代码语言:javascript复制
$ ./bin/hbase shell hbase>snapshot 'myTable', 'myTableSnapshot'

这里'myTable'是hbase的table名, 'myTableSnapshot'是快照的名字

创建好后可以使用list_snapshots确认是否成功

代码语言:javascript复制
hbase> delete_snapshot 'myTableSnapshot'

3.导出快照到目标集群

在源集群中导出快照到目标集群

代码语言:javascript复制
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot myTableSnapshot -copy-to hdfs://*.*.*.*:*/hbase/snapshot/myTableSnapshot

这里ip、port是目标集群的ip和port, 导出快照是系统级别会启动一个mapreduce的任务,可以在后面增加-mappers 16 -bandwidth 200来指定mapper和带宽, 这里200指的指200 MB/sec.

4. 快照还原到目标集群的目标hdfs

在目标集群中执行

代码语言:javascript复制
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot myTableSnapshot -copy-from /hbase/snapshot/myTableSnapshot -copy-to /hbase/

5.在目标集群从hdfs恢复相应的hbase表及数据

在目标集群执行

代码语言:javascript复制
hbase> disable "myTable"
hbase>restore_snapshot 'myTableSnapshot'
hbase> enable 'myTable'

附:hbase到emr-hbase迁移方案

背景

Hbase是在支撑环境部署的,而emr-hbase是vpc环境部署的,所以hbase->emr-hbase的服务不能直接访问,emr-hbase->hbase的网络可以通过vip来访问。所以在迁数据的时候是拉数据,而非hbase推数据。

1.在源Hbase集群创建测试表

代码语言:javascript复制
$ hbase shell
hbase>create 'myTable','cf'

2.插入测试数据

代码语言:javascript复制
hbase(main):002:0> put 'myTable','row1','cf:c1',1
0 row(s) in 0.1500 seconds
hbase(main):003:0> put 'myTable','row1','cf:c1',12
0 row(s) in 0.0250 seconds
hbase(main):004:0> put 'myTable','row1','cf:c2',1
0 row(s) in 0.0120 seconds
hbase(main):005:0> put 'myTable','row1','cf:c2',12
0 row(s) in 0.0110 seconds
hbase(main):006:0> put 'myTable','row1','cf:c3',3
0 row(s) in 0.0050 seconds
hbase(main):007:0> put 'myTable','row1','cf:c4',4
0 row(s) in 0.0090 seconds
hbase(main):008:0> put 'myTable','row1','cf:c5',5
0 row(s) in 0.0120 seconds

3.源集群创建并导出快照

代码语言:javascript复制
##创建快照
snapshot 'myTable', 'myTableSnapshot99'
##导出到本地
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot myTableSnapshot99 -copy-to /tmp/myTableSnapshot99

查看当前已有快照:

代码语言:javascript复制
hbase(main):044:0* list_snapshots
SNAPSHOT                              TABLE   CREATION TIME                                                                                       
myTableSnapshot-190305               myTable (Tue Mar 05 14:46:30  0800 2019)                                                                    
myTableSnapshot-19030514             myTable (Tue Mar 05 14:55:45  0800 2019)                                                                    
myTableSnapshot1                     myTable (Wed Mar 06 10:07:16  0800 2019)                                                                    
myTableSnapshot99                    myTable (Wed Mar 06 14:35:21  0800 2019)                                                                   
4 row(s) in 0.0310 seconds

4.目的集群拉取并存放快照

代码语言:javascript复制
hdfs dfs -cp  hdfs://*.*.*.*:*/tmp/myTableSnapshot99 /tmp/
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot myTableSnapshot99 -copy-from /tmp/myTableSnapshot99 -copy-to /hbase/

这里和之前不同的地方,直接用hdfs的-cp,ip、port是源集群hdfs的ip和port

5.恢复快照

代码语言:javascript复制
hbase> disable 'myTable'
hbase>restore_snapshot 'myTableSnapshot99'
hbase> enable 'myTable'

0 人点赞