我们有一个旧的基于 CDH3 的集群,我们将数据存储在该集群上的 HBase 中。我们还有全新的集群,其中安装了 CDH5.2。
我们想将 HBase 数据从 CDH3 集群迁移到 CDH5 集群。我想知道是否可以跨不同版本迁移数据?是否像使用 distcp
命令一样直接?
在迁移数据之前和迁移过程中我需要采取哪些预防措施?
最佳答案
我认为对此没有简单的解决方案。我能想到的最简单的解决方案是使用一个 MapReduce 作业将每个 HBase 表导出到 CDH3 集群上的 HDFS。一个 DistCp 作业将导出的 HDFS 数据从您的 CDH3 集群传输到 CDH5 集群上的 HDFS,最后每个表的一个 MapReduce 作业将 HDFS 数据导入 Hbase。
您可以使用不带缩减器的默认 IdentityTableMapper 将表从 HBase 导出到 HDFS。将 KEY、VALUE 设置为 ImmutableBytesWriable,将 org.apache.hadoop.hbase.client.Result 和输出格式类设置为 SequenceFileOutputFormat。基本上,这会将 HBase 表中的任何数据写入 SequenceFile 文件,并保留您直接从 HBase 读取的格式。
在 DistCp 之后的 CDH5 集群的导入端,使用此映射器类从导出的文件中读取数据并将它们写入 HBase 表。
public class HbaseSequenceFileToTableMapper extends TableMapper<ImmutableBytesWritable, Put>{
@Override
public void map(ImmutableBytesWritable row, Result value, Context context)
throws IOException {
try {
context.write(row, resultToPut(row, value));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static Put resultToPut(ImmutableBytesWritable key, Result result)
throws IOException {
Put put = new Put(key.get());
for (KeyValue kv : result.raw()) {
put.add(kv);
}
return put;
}
}
如果您必须将大量数据从旧集群传输到新集群,则此解决方案非常有用。
关于hadoop - 能否将CDH3的HBase数据导出,导入CDH5的HBase?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539918/