一、创建临时表
- 预切分
根据表数据特点选取合适的方式预切分表。
- 创建临时表
选取预切分方式,创建结构与原表格式相同的临时表。
二、数据迁移
- 原数据表数据导出
为了不影响线上HBase表,使用snapshot的ExportSnapshot方式把snapshot数据迁移到公共Hadoop集群进行处理。执行命令如下:
1 | hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ |
2.导出Snapshot数据
若没有Snapshot导出工具,仿照org.apache.hadoop.hbase.mapreduce.Export类编写SnapshotExport工具类,参考类容如下:
1 | Job job = new Job(conf); Path restoreDir = new Path("XX"); // restore dir should not be a subdirectory of hbase.rootdir Scan scan = new Scan(); TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, scan, MyTableMapper.class, MyMapKeyOutput.class, MyMapOutputValueWritable.class, job, true, restoreDir); |
执行SnapshotExport工具类,执行命令如下:
1 | hbase com.ke.dtarch.ExportSnapshot \ |
3.生成HFiles
根据Snapshot导出的数据使用org.apache.hadoop.hbase.mapreduce.Export生成HFiles,执行命令如下:
1 | hbase org.apache.hadoop.hbase.mapreduce.Import \ |
4.使用distcp把HFiles导到HBase集群
执行命令如下:
1 | hadoop distcp \ |
5.使用BulkLoad把HFile导入临时表
执行命令如下:
1 | hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \ |
三、HBase表替换
- 创建snapshot
给原表和临时表创建snapshot,执行命令如下:
1 | snapshot 'origin_table', 'origin_table_snapshot' snapshot 'tmp_table', 'tmp_table_snapshot' |
2.删除原表
1 | disable 'origin_table' drop 'origin_table' |
3.修改表名称
1 | clone_snapshot 'tmp_table_snapshot', 'origin_table' |
4.检查HBase表状态,无异常后,删除多余的表和数据