2012-04-24 38 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

相关问题