2012-04-24 34 views
4

所以,我有一個更新HBase表的Mapper。在地圖()函數,I:單個hadoop Mapper對象用於map()的多個調用嗎?

1)實例化HBaseConfiguration

2)實例化HTable

3)調用hTable.put()一堆次添加行

4)調用hTable.flushCommits()來沖洗我的變化

5)調用HConnectionManager.deleteConnection()殺HBase的

小時連接不過,這似乎效率低下。我想在我的Mapper類的構造函數中實例化HBaseConfiguration和HTable。然後,我可以讓我的映射器類實現Closeable,在close()方法中調用hTable.flushCommits()和HConnectionManager.deleteConnection()。這樣,在每次調用map()時,我都會緩衝我的put()調用,並且會在調用close()時立即刷新所有更改。

但是,如果Mapper對象再次用於map()的多次調用,這是唯一值得的。否則,我不妨留下我的代碼。

所以主要問題是:Mapper對象是否用於多次調用map()?

獎金問題是:重寫的代碼會更有效率嗎?

回答

4

您要找的是setupcleanupsetupmap被稱爲一堆次之前運行一次,並且在調用所有maps之後調用cleanup。您可以像覆蓋map一樣覆蓋這些內容。

使用私人成員對象爲您的HBaseConfigurationHTable。在setup中初始化它們。在你的map中做hTable.put()。請在您的cleanup中輸入hTable.flushCommits()HConnectionManager.deleteConnection()。唯一可能需要小心的是,在緩衝更多數據而不是內存可以處理的情況下,更多地清除提交。在這種情況下,您可能希望通過跟蹤您所看到的記錄數來刷新地圖中的每1000條記錄或其他內容。

這絕對會更高效!打開和關閉連接將會產生大量的開銷。

檢查出documentation for Mapper

+0

謝謝!這正是我需要的。 – sangfroid 2012-04-24 17:10:31

+1

嗨, 我想補充一句關於HTable Flushing的句子(「你可能想要小心的唯一的事情就是在你緩衝的數據比你的內存可以處理的情況下,更多地提交提交的內容」 )並不完全正確。 HTable在填充時會自動刷新緩衝區。請閱讀關於setWriteBufferSize(long writeBufferSize)方法的文檔。 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html – 2012-04-25 07:06:14

+0

不知道。謝謝@ dino.keco! – 2012-04-25 12:58:13

相關問題