在开始迁移前,需完成以下基础准备:
hbase snapshot或hbase export),防止迁移失败导致数据丢失。Export/Import是HBase自带的MapReduce工具,通过扫描源表数据并写入HDFS,再从HDFS导入目标表,适用于小规模数据或不需要实时同步的场景。
hbase org.apache.hadoop.hbase.mapreduce.Export命令,将指定表数据导出至HDFS路径(如/hbase_export/source_table)。hbase org.apache.hadoop.hbase.mapreduce.Export 'source_table' /hbase_export/source_tablehadoop distcp将导出的HDFS目录复制到目标集群的对应路径(如/hbase_export/source_table)。hadoop distcp hdfs://source-namenode:8020/hbase_export/source_table hdfs://target-namenode:8020/hbase_export/hbase org.apache.hadoop.hbase.mapreduce.Import命令,从HDFS路径导入数据至目标表(需提前创建相同结构的表)。hbase org.apache.hadoop.hbase.mapreduce.Import 'target_table' /hbase_export/source_tableSnapshot是HBase的轻量级备份机制,通过创建表的“瞬间视图”(仅记录元数据变化,不复制实际数据),实现快速迁移,适合大规模数据或生产环境。
flush命令将表数据刷新至HDFS,再创建快照(如table_name_snapshot)。hbase shell> flush 'source_table'
hbase shell> snapshot 'source_table', 'table_name_snapshot'
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot工具,将快照从源集群HDFS复制到目标集群HDFS(需指定-copy-from和-copy-to参数)。hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dsnapshot.export.skip.tmp=true \ # 跳过临时目录,减少IO
-snapshot table_name_snapshot \
-copy-from hdfs://source-namenode:8020/hbase/.hbase-snapshot/table_name_snapshot \
-copy-to hdfs://target-namenode:8020/hbase/.hbase-snapshot/
restore_snapshot命令恢复快照(需提前创建相同结构的表)。hbase shell> disable 'target_table' # 禁用目标表
hbase shell> restore_snapshot 'table_name_snapshot'
hbase shell> enable 'target_table' # 启用目标表
CopyTable通过MapReduce并行扫描源表数据,直接写入目标表,适用于表级别的数据同步(如实时增量同步),但会对源集群性能产生一定影响。
hbase shell的describe命令查看源表结构)。hbase org.apache.hadoop.hbase.mapreduce.CopyTable命令,指定源表名、目标表名及可选参数(如-Dmapreduce.map.memory.mb调整Map内存)。hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
-Dmapreduce.map.memory.mb=2048 \ # 增加Map内存,避免OOM
-Dhbase.client.scanner.caching=1000 \ # 提高扫描缓存,提升速度
source_table target_table
Bulk Load通过直接生成HFile格式文件并加载到HBase,绕过Write-Ahead Log(WAL)和RegionServer的处理,是大规模数据迁移的最高效方式(比Import快10倍以上),但不支持实时同步。
hbase export命令将表数据导出至HDFS(同Export/Import的第一步)。HFileOutputFormat2工具将导出的数据转换为HFile格式(需指定目标表名、输出路径)。hbase org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2 \
-Dmapreduce.job.output.key.class=org.apache.hadoop.hbase.KeyValue \
-Dmapreduce.job.output.value.class=org.apache.hadoop.hbase.KeyValue \
-Dmapreduce.job.output.format=org.apache.hadoop.hbase.mapreduce.TableOutputFormat \
-Dhbase.table.name=target_table \
/hbase_export/source_table /hbase_hfiles
LoadIncrementalHFiles工具将生成的HFile文件加载到目标表(需提前禁用目标表以提升加载速度)。hbase shell> disable 'target_table'
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
-Dmapreduce.job.name='Load HFiles' \
/hbase_hfiles target_table
hbase shell> enable 'target_table'
Replication是HBase的原生实时同步功能,通过配置源集群与目标集群的复制关系,自动同步增量数据(如实时写入、更新),适合需要保持数据一致性的场景(如主从集群)。
hbase-site.xml中添加复制相关配置(如hbase.replication设为true),并创建Peer(指定目标集群的ZooKeeper地址)。hbase shell> add_peer '1', 'zk1:2181,zk2:2181,zk3:2181:/hbase'
hbase shell> start_replication '1'count、scan命令)。hbase shell> count 'target_table'flush确保数据落盘),避免数据丢失。mapreduce.map.memory.mb、hbase.regionserver.handler.count)。