java - 单个 hadoop Mapper 对象是否用于多次调用 map()?

标签 java hadoop mapreduce hbase hdfs

所以,我有一个更新 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()?

额外的问题是:重写的代码会更有效率吗?

最佳答案

您正在寻找的是setupcleanupsetupmap 被多次调用之前运行一次,而 cleanup 在所有 map 被调用之后被调用一次叫。您可以像覆盖 map 一样覆盖它们。

为您的 HBaseConfigurationHTable 使用私有(private)成员对象。在 setup 中初始化它们。在你的 map 中执行你的 hTable.put()。在您的cleanup 中执行hTable.flushCommits()HConnectionManager.deleteConnection()。您可能需要注意的唯一一件事是刷新提交,而不仅仅是在最后刷新提交,以防您缓冲的数据多于内存可以处理的数据。在这种情况下,您可能希望每 1000 条记录或 map 中的某些内容刷新一次,方法是跟踪您看到的记录数。

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

查看 documentation for Mapper

关于java - 单个 hadoop Mapper 对象是否用于多次调用 map()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301858/

相关文章:

hadoop 输入路径不存在

hadoop - 如何使用Sqoop以Parquet-Avro文件格式保存数据?

hadoop - Map Reduce 已完成但 pig 作业失败

hadoop - Pig 程序无缘无故地卡在一个阶段

linux - SSh:拒绝连接到本地主机

java - 如何将列乘以ListView中的数字,Android

java - 使用数据文件进行 Junit 测试

java - 将 SVG 转换为 PDF

hadoop - 现有 MapReduce 与 YARN (MRv2) 的区别

java - 调用接口(interface)方法时避免向下转型