java - Hadoop mapper/reducer 重用

标签 java hadoop mapreduce

mapper/reducer 实例如何在永久保持 Activity 状态的 jvm 中重新使用?

例如,假设我想做这样的事情:

public class MyMapper extends MapReduceBase implements Mapper<K1, V1, K2, V2> {

    private Set<String> set = new HashSet<String>();

    public void map(K1 k1, V1 v1, OutputCollector<K2, V2> output, Reporter reporter) {
        ... do stuff ...

        set.add(k1.toString()); //add something to a list so that it can be used later

        ... do other stuff ...


        if(set.contains("someString"))
            emitSomeKindOfOutput(output);
        else
            emitSomeOtherKindOfOutput(output);
    }

}

如果同一个映射器可用于多个任务/作业,那么成员集可能会导致问题,因为它仍然包含来自先前任务/作业的其他垃圾。在 hadoop 中可以进行这种重用吗? reducer 呢?

最佳答案

你绝对安全。 Mapper 和 reducer 实例不被重用。如果您需要执行一些初始化或清理,您可以覆盖 MapReduceBase 提供的两个方法 configureclose。这不是您的代码示例所要求的。

如果 set 是一个静态变量,那么您必须在 close() 方法中清除它是安全的,即使不是大多数站点配置都需要(基本上默认情况下每个 map 都会派生一个新的 JVM,您必须配置 reuse.jvm.num.tasks 以启用 JVM 重用)。两个映射任务永远不会在同一个 JVM 中同时运行。

关于java - Hadoop mapper/reducer 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15347095/

相关文章:

java - 用 Java 调试我的字母成绩计算器

hadoop - pig 拉丁删除数据包中的元组

python - Apache Spark : Error while starting PySpark

perl - 将 Hadoop 流与 perl 结合使用以进行 map reduce

java - 查找我的浮点值 ArrayList 的最小值

java - Hibernate:没有 SQL 字符串的查询?

java - 使用 Java 进行序列化 I/O

hadoop - 如何停止Hadoop cat:在shell中运行循环时无法自动写入输出流?

hadoop - map 缩减框架中的 map 阶段实现

java - 与 Hadoop MapReduce 的成对比较