HBase2.1.0数据迁移方案
业务要求:将数据从旧的集群HBase1.2迁移到HBase2.1.0中去。每个表的数据量级10TB左右
值得注意:HBase升级到Hbase2.x之后,他的数据修复工具独立出来作为 HBCK2 成立了一个单独的项目 ,并且这个项目并不是所有的hbase都支持,其中就包含我们正在使用的HBase2.1.0
说明:步骤一和步骤二的代码打包的jar包名为readhbase-1.0-SNAPSHOT.jar
步骤三的代码打包的包名为:bulkload.jar
因为两套集群的hbase版本不统一,因此生成region信息的maven依赖和写入region信息的maven依赖需要更换
如果你的版本支持HBCK2命令,那么你自己你迁移了HFile之后还是使用HBCK2命令比较好,我的这个方法可以用但是麻烦。
步骤一、迁移HFile数据
温馨提示:迁移之前一定要disable 需要迁移的hbase表,不然可能会报错,最可气的是报错了你没发现,一套流程走下来发现hbase的数据不够,原因就是部分数据没有迁移过来
使用Hadoop自带的命令distcp命令进行hadoop层面的数据移动,具体命令如下:【我的参考】
hadoop distcp \
-Dmapreduce.job.name=jobname \
-bandwidth 20 \
-m 20 \
hdfs://192.168.1.1:8020/habse/data/default/cdr201906 \
hdfs://192.168.2.1:8020/copy_data/cdr201906
-m为指定的map数量,默认为20个
-bandwith为带宽限制,防止一次同步过多的文件影响其他任务运行
-Dmapreduce.job.name为任务的名称【yarn的网页显示出来】
步骤二、迁移表的region
如果有hbck2命令可以使用该命令进行修复,但是正如我们前面所提到的,HBCK2命令不支持HBase2.1.0。不信你去查看【点击进入】那么我们只能另想思路了。
我的思路为复制分区+bulkload方案。由于复制来的数据已经是HFile了,我们就可以直接拿着这批数据入bulk到hbase,但是这样存在一个弊端,那就是只会形成一个region,一旦是这样,那么这个10TB左右的region要面临无尽的分裂,这样会大量消耗hbase的性能,于是就加上一个预分区在前面。先复制分区到新的机器,然后再复制数据。
我复制分区的方案为手动复制,也就是写java代码拷贝。代码如下
package load;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
public class MyRegionInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String tableName;
private List<String> columnFamilies;
private byte[][] regions;
public List<String> getColumnFamilies() {
return columnFamilies;
}
public void setColumnFamilies(List<String> columnFamilies) {
this.columnFamilies = columnFamilies;
}
public MyRegionInfo(String tableName, List<String> columnFamilys, byte[][] regions) {
this.tableName = tableName;
this.columnFamilies = columnFamilys;
this.regions = regions;
}
public MyRegionInfo() {
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public byte[][] getRegions() {
return regions;
}
public void setRegions(byte[][] regions) {
this.regions = regions;
}
@Override
public String toString(