我们可以从CDH3导出HBase数据并将其导入CDH5 HBase吗?

时间:2014-12-18 05:41:55

标签: hadoop hbase cloudera-cdh

我们有一个旧的基于CDH3的群集,我们将数据存储在此群集上的HBase中。我们还有一个全新的集群,其中安装了CDH5.2。

我们希望将HBase数据从CDH3群集移动到CDH5群集。我想知道是否可以跨不同版本迁移数据?是否像使用distcp命令一样直截了当?

迁移数据和迁移过程中需要采取哪些预防措施?

1 个答案:

答案 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;
}
}

如果您必须将大量数据从旧群集传输到新群集,则此解决方案非常有用。