0

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();

リカバリを確認するために、hbaseを再起動したときにtable.put(p)を実行(Eclipseでデバッグ)した直後にhbaseを停止しましたが、新しい行はテーブルで更新されません。memstore(cache)に書き込んだ後のHBaseのドキュメントによると、クラッシュは発生しても回復できますが、ここではWALが有効になっているのに回復していません
.....私の理解に何か問題がありますか
.....ありがとうございます返信のために事前に.....

4

1 に答える 1

0

上記のコードで何が起こるかというと、クライアントがサーバーにプットを送信することは決してないので、HBaseはそれをWALに書き込むことはなく、回復することはできません...

あなたはtable.setAutoFlush(false)プットの上の行にいます。ドキュメントをチェックすると、次のように書かれています。

「多くのPutを実行する場合は、HTableインスタンスでsetAutoFlushがfalseに設定されていることを確認してください。設定されていない場合、Putは一度に1つずつRegionServerに送信されます。Putはhtable.add(Put)およびhtable.add( put)同じ書き込みバッファに入れます。autoFlush= falseの場合、これらのメッセージは書き込みバッファがいっぱいになるまで送信されません。メッセージを明示的にフラッシュするには、flushCommitsを呼び出します。HTableインスタンスでcloseを呼び出すと、flushCommitsが呼び出されます。」

したがって、通常はAutoFlushをfalseに設定するのが適切ですが、この場合は、プットがまだサーバーに送信されていないことを意味します。

于 2013-03-16T18:28:52.273 に答える