【问题标题】:Recovery in HBaseHBase 中的恢复
【发布时间】:2013-03-15 08:35:59
【问题描述】:

HBase 支持单行原子事务。
用于实际检查。我写了以下代码

    Increment inc=new Increment();//For writing it to WAL
    inc.getWritetoWAL(); 
    Put p = new Put(Bytes.toBytes("name10"));
    p.add(Bytes.toBytes("cf"), Bytes.toBytes("name"),Bytes.toBytes("Some Value 10"));
    table.setAutoFlush(false);
    table.put(p);
    table.close();

为了检查恢复情况,我在执行(在 eclipse 中调试)table.put(p) 后立即停止了 hbase,当我重新启动 hbase 时,表中没有更新新行。根据 HBase 中的文档,一旦它写入 memstore(cache),虽然发生崩溃,但它可以恢复,但这里它没有恢复,尽管 WAL 已启用.....
我的理解有什么不对吗.....
提前谢谢大家的回复.....

【问题讨论】:

    标签: hadoop hbase


    【解决方案1】:

    上面的代码发生的情况是客户端永远无法将 put 提交到服务器,因此 HBase 永远不会将其写入 WAL,它无法恢复......

    您在看跌期权上方的行中有table.setAutoFlush(false)。如果你 check out the documentation 它说:

    "当执行大量 Puts 时,请确保 setAutoFlush 设置为 在您的 HTable 实例上为 false。否则,看跌期权将在 到 RegionServer 的时间。通过 htable.add(Put) 添加的看跌期权和 htable.add(Put) 在同一个写缓冲区中结束。如果自动冲洗 = false,这些消息在写缓冲区被填满之前不会发送。要显式刷新消息,请调用 flushCommits。打电话关闭 HTable 实例将调用 flushCommits。"

    因此,虽然在这种情况下通常将 AutoFlush 设置为 false 是好的,但这意味着 put 尚未发送到服务器。

    【讨论】:

    • 感谢您提供的信息(非常有帮助)。我已经修改了那部分代码,仍然面临问题...请检查此链接Click Here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多