我们有一个旧的基于CDH3的集群,并且在这个集群上存储在HBase中的数据。我们还拥有全新的集群,其中安装了CDH5.2。
我们希望将HBase数据从CDH3集群移动到CDH5集群。我想知道是否可以在不同版本之间迁移数据?它是否就像直接使用distcp命令?
在迁移数据之前和迁移过程中,我需要采取哪些预防措施?
发布于 2014-12-23 01:54:04
我不认为有一个简单的解决办法。我能想到的最简单的解决方案是使用一个MapReduce作业将每个HBase表导出到CDH3集群上的HDFS。一个DistCp作业将导出的HDFS数据从CDH3集群传输到CDH5集群上的HDFS,最后为每个表设置一个MapReduce作业将HDFS数据导入Hbase。
您可以通过使用没有还原器的默认HBase将表从HDFS导出到HDFS。将键、值设置为ImmutableBytesWriable、org.apache.hadoop.hbase.client.Result和输出格式类为SequenceFileOutputFormat。基本上,这将将HBase表中的任何数据写入到SequenceFile文件中,并保留直接从HBase读取数据的格式。
在CDH5集群的导入端,在DistCp之后,使用这个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;
}
}如果必须将大量数据从旧集群传输到新集群,则此解决方案非常有效。
https://stackoverflow.com/questions/27539918
复制相似问题