在Debian环境下,HBase数据迁移可通过Export/Import、CopyTable、DistCp、Snapshot等方式实现,以下是具体操作流程及注意事项:
hbase-client、hadoop-client等必要工具。hadoop(HDFS操作)和hbase(HBase操作)用户执行命令,避免权限不足问题。hbase snapshot),防止数据丢失。步骤:
Export工具将源表数据dump到HDFS。sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <hdfs_output_path> [versions starttime endtime]
示例:导出user_table表的所有版本数据到HDFS的/hbase/export/user_table路径:sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.Export user_table /hbase/export/user_table
hadoop distcp复制导出的数据:hadoop distcp hdfs://source-namenode:8020/hbase/export/user_table hdfs://target-namenode:8020/hbase/import/user_table
hbase shell> create 'user_table', 'cf1', 'cf2'
Import工具将HDFS中的数据导入目标表:sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.Import user_table /hbase/import/user_table
scan命令检查目标表数据是否一致:hbase shell> scan 'user_table', {LIMIT=>10}
步骤:
CopyTable工具将源表数据实时同步到目标表(支持部分列族或时间范围)。sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=<target_zk_quorum>:/hbase \ # 目标集群ZooKeeper地址
--families=<cf1,cf2> \ # 同步的列族(可选)
--starttime=<start_timestamp> \ # 起始时间戳(可选)
--endtime=<end_timestamp> \ # 结束时间戳(可选)
<tablename>
示例:同步order_table表的cf1列族,时间范围为2025-01-01至2025-11-11:sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=target-cluster-zk1:2181,target-cluster-zk2:2181:/hbase \
--families=cf1 \
--starttime=1704067200000 --endtime=1704153600000 \
order_table
mapreduce.local.map.tasks.maximum(并行map数)和hbase.client.scanner.caching(扫描缓存)提升性能。步骤:
distcp命令复制源集群HBase数据目录到目标集群:hadoop distcp hdfs://source-namenode:8020/hbase/data/default/<tablename> \
hdfs://target-namenode:8020/hbase/data/default/<tablename>
hbck工具修复Region分配和元数据问题:sudo -u hbase hbase hbck -fixAssignments -fixMeta
hbase shell检查目标表数据完整性。步骤:
hbase shell> snapshot '<tablename>', '<snapshotname>'
示例:为product_table创建名为product_snapshot的快照:hbase shell> snapshot 'product_table', 'product_snapshot'
ExportSnapshot工具将快照复制到目标集群HDFS。sudo -u hbase hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot <snapshotname> \
-copy-from <source_hdfs_snapshot_path> \
-copy-to <target_hdfs_snapshot_path> \
-mappers <num_mappers> \ # 并行任务数(根据集群资源调整)
-bandwidth <bandwidth_mb> # 带宽限制(MB/s,避免影响集群性能)
示例:将product_snapshot复制到目标集群,使用100个map任务,带宽限制为500MB/s:sudo -u hbase hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot product_snapshot \
-copy-from hdfs://source-namenode:8020/hbase/.hbase-snapshot/product_snapshot \
-copy-to hdfs://target-namenode:8020/hbase/.hbase-snapshot/product_snapshot \
-mappers 100 -bandwidth 500
hbase shell> restore_snapshot '<snapshotname>'
scan命令检查目标表数据是否与源表一致。count命令或自定义脚本)。hbase shell的status命令检查目标集群Region分布是否均匀。-bandwidth参数控制流量。CopyTable的--starttime/--endtime参数或DistCp的增量模式。/hbase/export目录),释放存储空间。