所以,我有一个更新 HBase 表的映射器。在 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() 时立即刷新所有更改。
但是,只有在多次调用 map() 时重新使用 Mapper 对象时才值得这样做。否则,我还不如留下我的代码。
所以主要问题是:Mapper 对象是否用于多次调用 map()?
额外的问题是:重写的代码会更有效率吗?
最佳答案
您正在寻找的是setup
和cleanup
。 setup
在 map
被多次调用之前运行一次,而 cleanup
在所有 map
被调用之后被调用一次叫。您可以像覆盖 map
一样覆盖它们。
为您的 HBaseConfiguration
和 HTable
使用私有(private)成员对象。在 setup
中初始化它们。在你的 map
中执行你的 hTable.put()
。在您的cleanup
中执行hTable.flushCommits()
和HConnectionManager.deleteConnection()
。您可能需要注意的唯一一件事是刷新提交,而不仅仅是在最后刷新提交,以防您缓冲的数据多于内存可以处理的数据。在这种情况下,您可能希望每 1000 条记录或 map 中的某些内容刷新一次,方法是跟踪您看到的记录数。
这样效率肯定会更高!打开和关闭该连接会产生大量开销。
关于java - 单个 hadoop Mapper 对象是否用于多次调用 map()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301858/