一、Hbase跨集群迁移方式## 标题
Hbase跨集群迁移的方式:copyTable、distcp、export/import、snapshot。
备注:新集群Hbase 版本cdh 2.1.0。
1、copyTable方式集群间迁移(HBase层数据迁移)
copyTable也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。copyTable的本质也是利用MapReduce进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。
#1、ssh登录服务器 (切换到hbase用户)
源集群节点: (hbase用户)
目标集群节点:(hbase 用户)
#2、在目标集群上创建同名同结构的表
源集群执行 desc tablename ,结果去除特殊字符后,在目标集群hbase shell 命令行执行
create 'table',{name =>}
#3、确保待迁移的表无读写
#hbase shell 执行
flush 'table_name'
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
-Dhbase.client.scanner.caching=5000 -Dmapreduce.local.map.tasks.maximum=30 \
-Dmapred.map.tasks.speculative.execution=false -Dbandwidth=200 \
--peer.adr=zkip:2181:/hbase \
--new.name='table_new' table_name
#.增量备份:增量备份表数据,参数中支持timeRange,指定要备份的时间范围,使用方式如下
hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --starttime=start_timestamp --endtime=end_timestamp
#4、对比原集群与目标集群表数据量
count 'table_name'
2、Distcp 方式集群间迁移(Hadoop层数据迁移)
两个步骤:
(1)拷贝底层表hdfs数据
(2)使用hbck工具恢复表数据
#1、数据刷盘
> flush 'test_hbase2_permiss_move'
#2、distcp 离线拷贝,放在目标集群hbase的/tmp或者临时目录
sudo -u hbase hadoop distcp -bandwidth 2 -m 100 -skipcrccheck -update hdfs://ip:8020/hbase-2/data/default/test_hbase2_permiss_move hdfs://ip:8020/hbase/data/default/test_hbase2_permiss_move
备注:
distcp 拷贝时可根据配置文件过滤掉不需要的目录,如过滤空表
过滤空表 节点 /home/hadoop/distcp_table_filter.txt 为需过滤掉的文件,
正则路径如 hdfs:\/\/.*\.*\.*\.*:8020\/hbase\/data\/default\/test_hbase_permiss_03\/.*
#测试
hadoop distcp -bandwidth 2 -m 100 -filters ./distcp_table_filter.txt hdfs://ip:8020/hbase/data/default/* hdfs://ip:8020/tmp/test_distcp
以上为数据拷贝步骤。
以下为恢复数据操作,需要下载hbck工具 https://github.com/apache/hbase-operator-tools
数据恢复的详细步骤:
#移动文件到目标目录 用hbase用户
1、 sudo -u hbase hdfs dfs -mv /tmp/default/* /hbase/data/default/
2、重启master
3、添加元数据
sudo -u hbase hbase hbck -j /opt/hbase_move/hbase-hbck2/hbase-hbck2-1.1.0.jar addFsRegionsMissingInMeta default:fw_res
4、重启master
5、重新分配region
sudo -u hbase hbase hbck -j /opt/hbase_move/hbase-hbck2/hbase-hbck2-1.1.0.jar assigns 766a0d5e3394a83a258e5db20a6ec604 dc5b4bc928c518b0d3bf6ebd247e96b9
6、合并region
sudo -u hbase sh merging-region.sh 1 1000 fw_res >> /opt/hbase_move/merge_region/20210815-01.log
3、Snapshot方式
#快照
hbase shell
> flush 'table_name'
> snapshot 'table_name', 'table_name_snapshot'
> list_snapshots
> delete_snapshot 'table_name_snapshot'
#迁移快照
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dsnapshot.export.skip.tmp=true \
#导出大表时需加上,不加的话默认快照引用会先写入/hbase/.hbase-snapshot/.tmp下,等hfile拷贝完成后正式写入/hbase/.hbase-snapshot下,但在拷贝过程中,snapshot是不是被hfilecleaner识别,超时后会删除archive下的文件,小表没问题,大表会报错,filenotfound
-Dmapreduce.map.memory.mb=2048
#指定每个map的内存
-snapshot table_name_snapshot \
-copy-from hdfs://ip:8020/hbase-2 \
-copy-to hdfs://ip:8020/hbase \
-mappers 16 \
-bandwidth 100 \
-overwrite
3. 恢复(在cluster02进行)
方式1:会覆盖原表device
hbase shell
> disable device
> restore_snapshot 'device_snapshot01'
> enable device
方式2:恢复到新表
> clone_snapshot 'table_name_snapshot','table_name_new'
HBase ExportSnapshot报FileNotFoundException问题分析
4、Export/Import方式
此方式与CopyTable类似,主要是将HBase表数据转换成Sequence File并dump到HDFS,也涉及Scan表数据,与CopyTable相比,还多支持不同版本数据的拷贝,同时它拷贝时不是将HBase数据直接Put到目标集群表,而是先转换成文件,把文件同步到目标集群后再通过Import到线上表。主要有两个阶段:
Export阶段: 将原集群表数据Scan并转换成Sequence File到Hdfs上,因Export也是依赖于MR的,如果用到独立的MR集群的话,只要保证在MR集群上关于HBase的配置和原集群一样且能和原集群策略打通(master®ionserver策略),就可直接用Export命令,如果没有独立MR集群,则只能在HBase集群上开MR,若需要同步多个版本数据,可以指定versions参数,否则默认同步最新版本的数据,还可以指定数据起始结束时间,使用如下:
hbase org.apache.hadoop.hbase.mapreduce.Export
Import阶段: 将原集群Export出的SequenceFile导到目标集群对应表,使用如下:
#如果原数据是存在原集群HDFS,此处input_hdfs_path可以是原集群的HDFS路径,如果原数据存在目标集群HDFS,则为目标集群的HDFS路径
hbase org.apache.hadoop.hbase.mapreduce.Import
二、Hbase跨集群不停服数据迁移## 标题
Hbase 的 snapshot + replication 实现不停服数据迁移。主要思路是主集群开启复制,使用快照迁移历史数据,通过replication同步增量数据,使主从集群保持数据一致后即可断开主从关系,实现不停服数据迁移。具体实施时根据开启复制时机有两种方法。
(1)主从复制连同后,先暂停复制,创建快照,迁移快照,从集群恢复数据后,后开启暂停的复制
#[[[需打开source集群 hbase shell 命令行、sink集群 hbase shell命令行、sink集群的服务器shell 命令行 ]]]
# 1、老集群(source)hbase shell命令行执行 - 获取表结构
describe 'table_name'
# 2、新集群(sink)hbase shell命令行执行 - 新集群建同结构表
create 'table_name',{NAME => 't', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '1', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536', METADATA => {'COMPRESSION_COMPACT' => 'GZ'}}
list
# 3、老集群(source)hbase shell命令行执行 - 开启表的replication_scope
disable 'table_name'
alter 'table_name', {NAME = > 't', REPLICATION_SCOPE = > '1'}
enable'table_name'
list_replicated_tables
# 4、老集群(source)hbase shell命令行执行 - 添加从集群和复制表
add_peer 'cdhservice', 'zkip:2181:/hbase', 'table_name'
list_peers
# 4、老集群(source)hbase shell命令行执行 - 添加需要复制的表和列簇
set_peer_tableCFs 'cdhservice', 'table_name'
list_peers
########[[[测试source与sink是否可以复制数据]]]########
# 5、新集群(sink)hbase shell命令行执行 - disable sink表
disable 'table_name'
is_disabled ''
# 6、老集群(source)hbase shell命令行执行 - flush 并且创建快照
flush 'table_name'
snapshot 'table_name', 'table_name_snapshot'
list_snapshots
# 7、新集群(sink)的服务器 shell命令行执行 - 导出快照到sink集群
sudo -u hbase hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dsnapshot.export.skip.tmp=true \
-snapshot table_name_snapshot \
-copy-from hdfs://ip:8020/hbase \
-copy-to hdfs://ip:8020/hbase \
-mappers 100 -bandwidth 500 -overwrite
list_snapshots
# 8、新集群(sink)hbase shell命令行执行 - 新集群使用快照恢复历史数据
restore_snapshot 'table_name_snapshot'
# 9、新集群(sink)hbase shell命令行执行 - enable sink表
enable 'table_name'
is_enabled ''
#---------观察主从数据是否平衡--------END------#
关于replication的命令及用法:
1、replication_scope: 表是否允许被复制(是否产生复制wal),产生的wal将被region读取后写入不同的peers
2、set_peer_tableCFs: 主从集群之间数据同步的表清单,如不设置默认为所有开启replication_scope的表
3、add_peer : 创建主从集群的复制关系(创建后自动开启enable_peer,由于此时未设置set_peer_tableCFs,复制表是所有开启复制的表,如果从集群未建表会报错)
注意事项: 建议add_peer时显式指定需要复制的表的列表,如未指定列表,后用set_peer_tableCFs设置引起replication不可用,regionserver报错,需重启regionserver节点
4、disable_peer : 暂停复制,主从之间的数据同步在当前读取复制wal的位点停止,并记录当前的消费位点,用于复制的wal正常产生
5、enable_peer : 开始复制,如已存在该peer的消费位点,则从上次记录的消费位点开始,如无消费位点则从当前时点开始消费 (add_peer默认自动开启,如停止需 disable_peer)
6、remove_peer : 移除主从集群的复制关系,不影响用于复制的wal产生,其他peers可正常复制
(2)先创建快照,迁移到从集群并恢复后,开启复制,export/import 将创建快照到开启复制之间的数据导出后导入新集群
注意:该方式需要注意数据是否仅有insert,如有update操作,可能会出现import时会覆盖replication的数据。
#不停服数据迁移(指定时间戳离线拷贝间隔数据)
#1、添加原集群到目标集群的replication关系,并在目标集群中建立与原集群相同的表;
#2、通过snapshot把历史数据导入到从集群:
在原集群执行以下指令:
a、list_snapshots
b、snapshot ‘test_table’, ‘test_table_snapshot'
c、bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_table_snapshot -copy-to hdfs://ip:8020/hbase -mappers 16
在目标集群执行以下指令:
a、disable ‘test_table'
b、restore_snapshot ‘test_table_snapshot’
c、enable 'test_table'
#3、开启原表的replication
原集群执行:
alter ‘test_table’,{NAME=>’f’,REPLICATION_SCOP=>’1’}
#4、通过Export工具把快照和开启replication之间的数据导入到从表;
#Export 在原集群执行以下指令: 指定1版本,起止时间戳导出
hbase org.apache.hadoop.hbase.mapreduce.Export test_re_01 hdfs://ip:8020/tmp/export 1 1629199320000 1629199380000
1:指定了版本数,与线上一致
1445875200000 1445961600000:指定了起始时间戳
#Import 在目标集群执行以下指令:
hbase org.apache.hadoop.hbase.mapreduce.Import test_re_01 hdfs://ip:8020/tmp/export