如何使用starttime endtime导出hbase表?

bbmckpt7  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(369)

我正在尝试执行增量备份,我已经选中了导出选项,但无法确定开始时间选项。另外,请在copytable上建议如何还原。

axr492tv

axr492tv1#

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是tablename,/bkp\u destination/test是backup destination folder,1369060183200是starttime,1369063567260023219是endtime

n3ipq98p

n3ipq98p2#

源代码表明
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\u值;
接受的答案不传递version作为参数。那是怎么回事?
hbase org.apache.hadoop.hbase.mapreduce.export test/bkp\u destination/test 1369060183200 1369063567260023219
从源代码可以归结为-
1369060183200-args[2]-版本
1369063567260023219-参数[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;
  }
ujv3wf0j

ujv3wf0j3#

使用copytable,您只需在同一集群或另一集群上接收给定表的副本(实际上是copytable mapreduce作业)。没有奇迹。
如何恢复由您自己决定。显而易见的选择是:
使用相同的工具将表复制回。
只需获取/放置选定的行(我认为您需要在这里)。请注意,在放回数据时,您应该保留时间戳。
实际上,对于增量备份,您只需编写一个作业即可,该作业扫描表并获取/将具有给定时间戳的行放入名为date的表中。还原应该以相反的方向工作-读取具有计算名称的表,并将其记录放置在具有相同时间戳的位置。
我还向您推荐以下技术:表快照(cdh4.2.1使用hbase 0.94.2)。它看起来不适用于增量备份,但您可能会在这里发现一些有用的东西,比如附加的api。从备份的Angular 来看现在看起来不错。
希望这能有所帮助。

相关问题