所以,我有一个更新HBase表的映射器。 在 map() 函数中,I :
1) 实例化 HBase配置
2) 实例化一个 HTable
3)调用hTable.put()很多次来添加行
4) 调用 hTable.flushCommits() 来刷新我的更改
5) 调用 HConnectionManager.deleteConnection() 以终止与 HBase 的连接
但是,这似乎效率低下。 我想在我的映射器类的构造函数中实例化HBaseConfiguration和HTable。 然后我可以让我的映射器类实现 Closeable,在 close() 方法中调用 hTable.flushCommits() 和 HConnectionManager.deleteConnection()。 这样,在每次调用 map() 时,我都会缓冲我的 put() 调用,并在调用 close() 时立即刷新所有更改。
但是,仅当 Mapper 对象被重用于对 map() 的多次调用时,这才值得。 否则,我不妨不要管我的代码。
所以主要问题是:Mapper 对象是否用于对 map() 的多次调用?
额外的问题是:重写的代码会更有效率吗?
您正在寻找的是setup
和cleanup
。 setup
在调用map
之前运行一次,cleanup
在所有maps
被调用后被调用一次。您覆盖这些就像覆盖map
一样。
将私有成员对象用于HBaseConfiguration
和HTable
。在setup
中初始化它们。在你的map
里做你的hTable.put()
.在你的cleanup
里hTable.flushCommits()
和HConnectionManager.deleteConnection()
。您可能唯一需要注意的是,在您缓冲的数据超过内存可以处理的数据的情况下,不要在最后刷新提交。在这种情况下,您可能希望通过跟踪您看到的记录数来刷新地图中的每 1000 条记录或某些内容。
这肯定会更有效率!打开和关闭该连接将产生大量开销。
查看映射器的文档