所以,我有一个更新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()?
奖金问题是:重写代码会更有效吗?
答案 0 :(得分:4)
您要找的是setup
和cleanup
。 setup
在map
被调用一次之前运行一次,cleanup
在调用所有maps
后调用一次。您可以覆盖这些,就像覆盖map
。
为HBaseConfiguration
和HTable
使用私有成员对象。在setup
中初始化它们。在hTable.put()
中使用map
。在hTable.flushCommits()
中HConnectionManager.deleteConnection()
和cleanup
。您可能要小心的唯一事情就是在缓冲更多数据而不是内存可以处理的情况下,更多地刷新提交。在这种情况下,您可能希望通过跟踪您看到的记录数来刷新地图中的每1000条记录或其他内容。
这肯定会更有效率!打开和关闭该连接将产生大量开销。