2012-04-24 18 views
4

したがって、HBaseテーブルを更新するMapperがあります。地図()関数において、Iは:map()への複数回の呼び出しに1つのハープマップMapperオブジェクトが使用されていますか?

1)行

を追加するHBaseConfiguration

2)インスタンスHTable

3)hTable.putを(呼び出し)回の束をインスタンス4)コールhTable.flushCommits()私の変更をフラッシュする

5)HBaseの

Hへの接続を殺すためにHConnectionManager.deleteConnection()を呼び出ししかし、これは非効率的だと思われる。私は、MaaseクラスのコンストラクタでHBaseConfigurationとHTableをインスタンス化したいと思います。次に、mapperクラスにcloseableを実装させ、close()メソッドでhTable.flushCommits()とHConnectionManager.deleteConnection()を呼び出します。こうすることで、map()の各呼び出しでput()呼び出しをバッファリングし、close()が呼び出されたときに一度にすべての変更をフラッシュします。

ただし、これはmap()への複数回の呼び出しでMapperオブジェクトを再利用する場合にのみ有効です。さもなければ、私はコードだけを残すかもしれません。

したがって、主な質問は、map()を複数回呼び出すために使用されるMapperオブジェクトですか?

ボーナスの問題は次のとおりです。書き直されたコードの方が効率的でしょうか?

答えて

4

あなたが探しているのはsetupcleanupです。 setupmapの前に1回実行され、mapsが呼び出された後にはcleanupが1回呼び出されます。 mapを上書きするのと同じように、これらを上書きします。

HBaseConfigurationHTableにプライベートメンバーオブジェクトを使用します。 setupで初期化してください。 maphTable.put()を入力してください。 cleanuphTable.flushCommits()HConnectionManager.deleteConnection()を入力してください。注意する必要があるのは、メモリよりも多くのデータをバッファリングしている場合に、最後にコミットするだけでなく、コミットをフラッシュすることです。その場合は、見たレコードの数を記録して、1000レコードまたはマップ内の何かをフラッシュすることができます。

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

チェックアウトdocumentation for Mapper

+0

ありがとうございました!これはまさに私が必要としていたものです。 – sangfroid

+1

こんにちは、 私はHTableのフラッシュに関する文章を追加したいと思います( "注意しなければならないのは、メモリよりも多くのデータをバッファリングしている場合の終わりよりもコミットをフラッシュすることです。 )は完全に真実ではない。 HTableには、自動的にフラッシュされたバッファが満たされています。 setWriteBufferSize(long writeBufferSize)メソッドに関するドキュメントをお読みください。 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html –

+0

それを知らなかった。ありがとう@ dino.keco! –

関連する問題