一、简介
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'