我们有一个旧的基于CDH3的群集,我们将数据存储在此群集上的HBase中。我们还有一个全新的集群,其中安装了CDH5.2。
我们希望将HBase数据从CDH3群集移动到CDH5群集。我想知道是否可以跨不同版本迁移数据?是否像使用distcp
命令一样直截了当?
迁移数据和迁移过程中需要采取哪些预防措施?
答案 0 :(得分:2)
我认为没有一个简单的解决方案。我能想到的最简单的解决方案是使用一个MapReduce作业将每个HBase表导出到CDH3集群上的HDFS。一个DistCp作业将导出的HDFS数据从CDH3集群传输到CDH5集群上的HDFS,然后最终为每个表传输一个MapReduce作业,将HDFS数据导入Hbase。
您可以使用默认的IdentityTableMapper将表从HBase导出到HDFS,而不使用reducer。将KEY,VALUE设置为ImmutableBytesWriable,将org.apache.hadoop.hbase.client.Result设置为输出格式类,并将其设置为SequenceFileOutputFormat。基本上,这会将HBase表中的任何数据写入SequenceFile文件,保留格式,就像直接从HBase读取一样。
在DistCp之后的CDH5群集上的导入端,使用此mapper类从导出的文件中读取数据并将其写入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;
}
}
如果您必须将大量数据从旧群集传输到新群集,则此解决方案非常有用。