4

そのため、HBaseテーブルを更新するマッパーがあります。map()関数では、I:

1)HBaseConfigurationをインスタンス化します

2)HTableをインスタンス化します

3)hTable.put()を何度も呼び出して、行を追加します

4)hTable.flushCommits()を呼び出して、変更をフラッシュします

5)HConnectionManager.deleteConnection()を呼び出して、HBaseへの接続を切断します

ただし、これは非効率的なようです。MapperクラスのコンストラクターでHBaseConfigurationとHTableをインスタンス化したいと思います。次に、close()メソッドでhTable.flushCommits()とHConnectionManager.deleteConnection()を呼び出して、マッパークラスにCloseableを実装させることができます。そうすれば、map()を呼び出すたびに、put()呼び出しをバッファリングし、close()が呼び出されたときに、すべての変更を一度にフラッシュします。

ただし、これは、Mapperオブジェクトがmap()への複数の呼び出しに再利用される場合にのみ価値があります。それ以外の場合は、コードをそのままにしておくこともできます。

したがって、主な質問は次のとおりです。Mapperオブジェクトはmap()の複数の呼び出しに使用されますか?

ボーナスの質問は:書き直されたコードはより効率的でしょうか?

4

1 に答える 1

4

あなたが探しているのはsetupcleanupです。setup前に1回実行するmapと、何度もcleanup呼び出され、すべてが呼び出された後に1回maps呼び出されます。オーバーライドするのと同じように、これらをオーバーライドしますmap

HBaseConfigurationとにプライベートメンバーオブジェクトを使用しますHTable。でそれらを初期化しますsetup。あなたのであなたhTable.put()をしなさいmap。しhTable.flushCommits()てください。注意したいのは、メモリが処理できるよりも多くのデータをバッファリングしている場合に備えて、最後だけでなくコミットをフラッシュすることだけです。その場合、表示したレコードの数を追跡することにより、マップ内の1000レコードごとなどをフラッシュすることをお勧めします。HConnectionManager.deleteConnection()cleanup

これは間違いなくより効率的です!その接続を開いたり閉じたりすると、かなりのオーバーヘッドが発生します。

Mapperのドキュメントを確認してください

于 2012-04-24T16:55:26.437 に答える