Hadoop的Mapper对象是否跨多个线程共享?

JRa*_*aSH 5 multithreading hadoop

我想知道是否可以添加一个可以在多个map()调用中使用的成员对象.例如,StringBuilder:

private StringBuilder builder;

public void map(...){
    ...

    builder.setLength(0);
    builder.append(a);
    builder.append(b);
    builder.append(c);
    d = builder.toString();

    ...
}
Run Code Online (Sandbox Code Playgroud)

显然,如果映射器对象跨多个线程共享,则由于来自多个线程的并发访问,上面的构建器对象将不会按预期运行.

所以我的问题是:是否确保hadoop中的每个线程都将使用一个专用的映射器对象?或者它是可配置的行为?

谢谢

Tho*_*lut 2

只要你使用的不是该类MultithreadedMapper,而是你自己的类,就不会有问题。map()称为顺序而不是并行。

通常使用 aStringBuilder或其他数据结构来缓冲调用之间的一些对象。但请确保从输入对象中克隆对象,只有一个对象,并且它将被一遍又一遍地填充以防止大量 GC。

因此无需同步或处理竞争条件。