hbase数据迁移:基于 hbase Snapshot

初始环境说明

hbase有两个集群:集群A和集群B,这里是1.1.3版本,2.X版本还没有测试。
集群A上使用Phoenix创建表:
create table lbltest1 (id varchar PRIMARY KEY,account varchar ,passwd varchar);

然后插入一些数据

upsert into lbltest1 values ('011', '122', '342');
upsert into lbltest1 values ('012', '12', '3421');
upsert into lbltest1 values ('013', '123', '3422');
upsert into lbltest1 values ('014', '124', '3432');
upsert into lbltest1 values ('015', '125', '3442');
upsert into lbltest1 values ('016', '126', '3452');
upsert into lbltest1 values ('017', '127', '3426');
upsert into lbltest1 values ('018', '128', '3427');
upsert into lbltest1 values ('019', '129', '3428');
upsert into lbltest1 values ('010', '121', '3427');

接下来将集群A的表lbltest1 迁移到集群B上去。

表迁移

这里使用hbase的 Snapshot功能实现

手动flush刷新内存数据到磁盘

flush '7d8f7d560e9ef7d355bff43a60b0d226'
7d8f7d560e9ef7d355bff43a60b0d226来自于校验和,可以在hbase控制台中查看。注意,如果有多个region那么需要在每个region上执行。

在这里插入图片描述

创建快照

在集群A上创建快照

hbase(main):006:0> snapshot  'LBLTEST1', 'snapshot_LBLTEST1'
0 row(s) in 0.7990 secondss

查看快照命令list_snapshots。也可以使用通配符,比如查看map开头的快照 list_snapshots 'map.*'
删除快照命令:delete_snapshot

创建完快照后在/hbase根目录会产生一个目录.hbase-snapshot。我们也可以在hadoop中查看创建的快照文件:
在这里插入图片描述

数据迁移

命令:

./hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot "snapshot_LBLTEST1" -copy-from hdfs://集群A:9000/hbase -copy-to hdfs://集群B:9000/hbase -mappers 20 -bandwidth 20

$ ./hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot "snapshot_LBLTEST1" -copy-from hdfs://集群A:9000/hbase -copy-to hdfs://集群B:9000/hbase -mappers 20 -bandwidth 20
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/program/hbase-1.1.3/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/program/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/program/alluxio-1.7.0-hadoop-2.7/client/alluxio-1.7.0-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

等待其运行结束即可。
这种方式用于将快照表迁移到另外一个集群的时候使用,使用MR进行数据的拷贝,速度很快,使用的时候记得设置好bandwidth参数,以免由于网络打满导致的线上业务故障。

限速

为了不影响业务,通常需要限速。上面我们限制了mappers最多20个,网络带宽使用量最大20MB。
来看一下源码中的定义:

static final Option MAPPERS = new Option(null, "mappers", true,
    "Number of mappers to use during the copy (mapreduce.job.maps).");
static final Option BANDWIDTH = new Option(null, "bandwidth", true,
    "Limit bandwidth to this value in MB/second.");

恢复快照

上面把文件传递过去,还不能用,需要在集群B上恢复快照。

进入集群B的hbase shell,执行restore_snapshot命令:

hbase(main):005:0> restore_snapshot "snapshot_LBLTEST1"
0 row(s) in 4.4370 seconds

hbase(main):006:0> scan 'LBLTEST1'
ROW                                                                  COLUMN+CELL                                                                                                                                                                                              
 010                                                                 column=0:ACCOUNT, timestamp=1564551972424, value=121                                                                                                                                                     
 010                                                                 column=0:PASSWD, timestamp=1564551972424, value=3427                                                                                                                                                     
 010                                                                 column=0:_0, timestamp=1564551972424, value=x                                                                                                                                                            
 011                                                                 column=0:ACCOUNT, timestamp=1564551972315, value=122                                                                                                                                                     
 011                                                                 column=0:PASSWD, timestamp=1564551972315, value=342                                                                                                                                                      
//省略部分数据                                                                                                                                                 
10 row(s) in 0.1060 seconds

一般来说我们不建议使用restore_snapshot,而是使用clone_snapshot,这样可以避免数据丢失。
clone_snapshot 'snapshot_PERSON3', 'PERSON3'

在hbase shell中可以查询了,如果想在Phoenix中查询,需要创建表来建立映射关系:

0: jdbc:phoenix:localhost:2181> create table lbltest1 (id varchar PRIMARY KEY,account varchar ,passwd varchar);
10 rows affected (0.191 seconds)
0: jdbc:phoenix:localhost:2181> select * from lbltest1;
+------+----------+---------+
|  ID  | ACCOUNT  | PASSWD  |
+------+----------+---------+
| 010  | 121      | 3427    |
| 011  | 122      | 342     |
| 012  | 12       | 3421    |
| 013  | 123      | 3422    |
| 014  | 124      | 3432    |
| 015  | 125      | 3442    |
| 016  | 126      | 3452    |
| 017  | 127      | 3426    |
| 018  | 128      | 3427    |
| 019  | 129      | 3428    |
+------+----------+---------+
10 rows selected (0.197 seconds)
0: jdbc:phoenix:localhost:2181> 

done.

参考资料

发布了234 篇原创文章 · 获赞 227 · 访问量 95万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览