如何使用starttime endtime导出hbase表?

时间:2013-05-20 12:51:14

标签: hadoop hbase

我正在尝试执行增量备份,我已经检查了导出选项,但无法找出启动时间选项。另外请在CopyTable上建议,我该如何恢复。

3 个答案:

答案 0 :(得分:1)

使用CopyTable,您只需在the same or another cluster(实际上是CopyTable MapReduce作业)上收到给定表的副本。没有奇迹。

你自己决定如何恢复。明显的选择是:

  • 使用相同的工具将表格复制回来。
  • 只需获取/放置选定的行(我认为您需要这些行)。请注意在放回数据时应保留时间戳。

实际上,对于增量备份,它足以让您编写扫描表的作业,并将具有给定时间戳的行/放入具有按日期计算的名称的表中。恢复应该反向工作 - 读取具有计算名称的表并将其记录与相同的时间戳放在一起。

我还建议您使用以下技术:table snapshot(CDH 4.2.1使用HBase 0.94.2)。它看起来不适用于增量备份,但也许你会发现一些有用的东西,比如额外的API。从备份的角度来看,它看起来很不错。

希望这会有所帮助。

答案 1 :(得分:1)

源代码建议

int versions = 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 test / bkp_destination / test 1369060183200 1369063567260023219

从源代码可以归结为 -

1369060183200 - args [2] - 版本

1369063567260023219 - args [3] - starttime

为ref:

附加源代码
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;
  }

答案 2 :(得分:0)

发现了这个问题 hbase documentation说     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 是tablename, * / bkp_destination / test * 是备份目标文件夹 1369060183200 是开始时间, 1369063567260023219 是结束时间