hadoop - 能否将CDH3的HBase数据导出,导入CDH5的HBase?

标签 hadoop hbase cloudera-cdh

我们有一个旧的基于 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/

相关文章:

hadoop - 在pyspark中保存中间表的最佳方法

hadoop - 删除 Hbase 表时数据会发生什么情况?

hadoop - 双冒号在 Pig 中到底是什么意思?

hadoop - Hadoop:如何在Hadoop的mapreduce类中将多个列设置为键,并将多个列设置为值

cassandra - Hbase vs Cassandra vs Kafka 用于高分辨率时间序列数据存储

hadoop - 配置单元插入覆盖目录仅覆盖生成文件的直接路径而不是目录

hadoop - CCAH无需上课即可动手体验

java - 从 Java 应用程序在 hadoop 2.2 (Yarn) 上启动 mapreduce 作业

java - 如何使用Java导出Hbase表?

hadoop - 错误:使用Tableau在Cloudera上查询Impala时,表达式不在Group BY键中