4

所以,我有一个更新 HBase 表的 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

1 回答 1

4

您正在寻找的是setupcleanupsetup之前运行一次map被调用了很多次,并且cleanup在所有maps被调用之后被调用一次。你覆盖这些就像你覆盖一样map

HBaseConfiguration为您的和使用私有成员对象HTable。在setup. 做你hTable.put()map。做hTable.flushCommits()HConnectionManager.deleteConnection()在你的cleanup. 您可能需要注意的唯一一件事是刷新提交,而不是仅在最后刷新提交,以防您缓冲的数据超出内存可以处理的数量。在这种情况下,您可能希望通过跟踪您看到的记录数来刷新地图中的每 1000 条记录或其他内容。

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

查看Mapper 的文档

于 2012-04-24T16:55:26.437 回答