Hbase跨集群迁移

一、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 

你可能感兴趣的:(hbase,hadoop,big,data)