如何在HBase表中设置autoflush = false

时间:2015-07-11 11:20:19

标签: hadoop hbase

我有这个代码保存到HBase HTABLE。预期的行为是表将推送提交或“刷新”每个分区的put到hbase。

注意:这是更新后的代码

rdd.foreachPartition(p => {
  val table = connection.getTable(TableName.valueOf(HTABLE))
  val mutator = connection.getBufferedMutator(TableName.valueOf(HTABLE))

  p.foreach(row => {
    val hRow = new Put(rowkey)
    hRow.addColumn....
    // use table.exists instead of table.checkAndPut (in favor of BufferedMutator's flushCommits)
    val exists = table.exists(new Get(rowkey))
    if (!exists) {
      hRow.addColumn...
    }
    mutator.mutate(hRow)
  })
  table.close()
  mutator.flush()
  mutator.close()
})

在HBase 1.1中,不推荐使用HTable,并且org.apache.hadoop.hbase.client.Table中没有flushCommits()。

替换BufferedMutator.mutate(put)对于正常的放置是可以的,但是mutator没有任何类似于Table的checkAndPut。

3 个答案:

答案 0 :(得分:4)

在新API中,使用了BufferedMutator

您可以将Table t = connection.getTable(TableName.valueOf("foo"))更改为BufferedMutator t = connection.getBufferedMutator(TableName.valueOf("foo"))。然后将t.put(p);更改为t.mutate(p);

对我有用!

在我搜索时,即使在官方文件中,也几乎没有相关信息。希望我的回答很有帮助,有人可以更新文档。

答案 1 :(得分:0)

您需要将autoFlush设置为false,请参阅第11.7.4节 在http://hbase.apache.org/0.94/book/perf.writing.html

答案 2 :(得分:-1)

您不需要做任何事情,因为DONT想要在客户端缓冲放置。 By default, HBase client will not buffer the PUTS at client side.

只有当客户端处理何时向HBase RegionServers发送数据时,才需要显式调用flushCommits()。