Я не думаю, что для этого есть простое решение. Самое простое решение, которое я могу придумать, - использовать одно задание MapReduce для экспорта каждой таблицы HBase в HDFS на вашем кластере CDH3. Одно задание DistCp для переноса экспортированных данных HDFS из вашего кластера CDH3 в HDFS на кластере CDH5, а затем, наконец, одно задание MapReduce для каждой таблицы для импорта данных HDFS в Hbase.
Вы можете экспортировать таблицы из HBase в HDFS, используя IdentityTableMapper по умолчанию без редуктора. Установите KEY, VALUE в 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;
}
}
Это решение отлично работает, если вам необходимо перенести большое количество данных из старого кластера в новый кластер.