我正在尝试执行增量备份,我已经检查了导出选项但无法确定开始时间选项。另外请在 CopyTable 上提出建议,我该如何恢复。
3 回答
使用CopyTable ,您只需在同一个或另一个集群上接收给定表的副本(实际上是 CopyTable MapReduce 作业)。没有奇迹。
如何恢复由您自己决定。明显的选择是:
- 使用相同的工具将表格复制回来。
- 只需获取/放置选定的行(我认为你需要的)。请注意,在放回数据时应保留时间戳。
实际上,对于增量备份,您编写扫描表并将具有给定时间戳的行获取/放入表中的作业就足够了,该表的名称按日期计算。恢复应该以相反的方向工作 - 读取具有计算名称的表并将其记录放入相同的时间戳。
我还向您推荐以下技术:表快照(CDH 4.2.1 使用 HBase 0.94.2)。它看起来不适用于增量备份,但也许你会在这里找到一些有用的东西,比如额外的 API。从备份的角度来看,现在看起来不错。
希望这会有所帮助。
在这里找到了问题,hbase文档说
hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]
所以在尝试了一些组合之后,我发现它被转换为如下代码的真实示例
hbase org.apache.hadoop.hbase.mapreduce.Export test /bkp_destination/test 1369060183200 1369063567260023219
其中 test 是表名, /bkp_destination/test是备份目标文件夹, 1369060183200是开始时间, 1369063567260023219是结束时间
源代码建议
int 版本 = args.length > 2?Integer.parseInt(args[2]): 1;
long startTime = args.length > 3?Long.parseLong(args[3]): 0L;
long endTime = args.length > 4?Long.parseLong(args[4]): Long.MAX_VALUE;
接受的答案不会将版本作为参数传递。那时它是如何运作的?
hbase org.apache.hadoop.hbase.mapreduce.Export 测试 /bkp_destination/test 1369060183200 1369063567260023219
从源代码归结为 -
1369060183200 - args [2] - 版本
1369063567260023219 - args [3] - 开始时间
附加参考源:
private static Scan getConfiguredScanForJob(Configuration conf, String[] args) throws IOException {
Scan s = new Scan();
// Optional arguments.
// Set Scan Versions
int versions = args.length > 2? Integer.parseInt(args[2]): 1;
s.setMaxVersions(versions);
// Set Scan Range
long startTime = args.length > 3? Long.parseLong(args[3]): 0L;
long endTime = args.length > 4? Long.parseLong(args[4]): Long.MAX_VALUE;
s.setTimeRange(startTime, endTime);
// Set cache blocks
s.setCacheBlocks(false);
// set Start and Stop row
if (conf.get(TableInputFormat.SCAN_ROW_START) != null) {
s.setStartRow(Bytes.toBytesBinary(conf.get(TableInputFormat.SCAN_ROW_START)));
}
if (conf.get(TableInputFormat.SCAN_ROW_STOP) != null) {
s.setStopRow(Bytes.toBytesBinary(conf.get(TableInputFormat.SCAN_ROW_STOP)));
}
// Set Scan Column Family
boolean raw = Boolean.parseBoolean(conf.get(RAW_SCAN));
if (raw) {
s.setRaw(raw);
}
if (conf.get(TableInputFormat.SCAN_COLUMN_FAMILY) != null) {
s.addFamily(Bytes.toBytes(conf.get(TableInputFormat.SCAN_COLUMN_FAMILY)));
}
// Set RowFilter or Prefix Filter if applicable.
Filter exportFilter = getExportFilter(args);
if (exportFilter!= null) {
LOG.info("Setting Scan Filter for Export.");
s.setFilter(exportFilter);
}
int batching = conf.getInt(EXPORT_BATCHING, -1);
if (batching != -1){
try {
s.setBatch(batching);
} catch (IncompatibleFilterException e) {
LOG.error("Batching could not be set", e);
}
}
LOG.info("versions=" + versions + ", starttime=" + startTime +
", endtime=" + endTime + ", keepDeletedCells=" + raw);
return s;
}