是否有一个hadoop Mapper对象用于多次调用map()?

时间:2012-04-24 16:16:26

标签: java hadoop mapreduce hbase hdfs

所以,我有一个更新HBase表的Mapper。在map()函数中,我:

1)实例化HBaseConfiguration

2)实例化HTable

3)多次调用hTable.put()来添加行

4)调用hTable.flushCommits()来刷新我的更改

5)调用HConnectionManager.deleteConnection()来终止与HBase的连接

然而,这似乎效率低下。我想在我的Mapper类的构造函数中实例化HBaseConfiguration和HTable。然后我可以让我的mapper类实现Closeable,在close()方法中调用hTable.flushCommits()和HConnectionManager.deleteConnection()。这样,在每次调用map()时,我都会缓冲put()调用,并在调用close()时立即刷新所有更改。

但是,如果将Mapper对象重新用于map()的多次调用,这是值得的。否则,我也可以单独留下我的代码。

所以主要问题是:Mapper对象是否用于多次调用map()?

奖金问题是:重写代码会更有效吗?

1 个答案:

答案 0 :(得分:4)

您要找的是setupcleanupsetupmap被调用一次之前运行一次,cleanup在调用所有maps后调用一次。您可以覆盖这些,就像覆盖map

一样

HBaseConfigurationHTable使用私有成员对象。在setup中初始化它们。在hTable.put()中使用map。在hTable.flushCommits()HConnectionManager.deleteConnection()cleanup。您可能要小心的唯一事情就是在缓冲更多数据而不是内存可以处理的情况下,更多地刷新提交。在这种情况下,您可能希望通过跟踪您看到的记录数来刷新地图中的每1000条记录或其他内容。

这肯定会更有效率!打开和关闭该连接将产生大量开销。

查看documentation for Mapper