我想知道是否可以添加一个可以在多个map()调用中使用的成员对象。例如,一个StringBuilder:Hadoop的Mapper对象是否跨多个线程共享?
private StringBuilder builder;
public void map(...){
...
builder.setLength(0);
builder.append(a);
builder.append(b);
builder.append(c);
d = builder.toString();
...
}
显然,如果映射器对象在多个线程共享,构建器对象上方不会像预期的那样,由于从一个以上的线程的并发访问。
所以我的问题是:是否确定hadoop中的每个线程都会为自己使用一个专用的映射器对象?或者它是一种可配置的行为?
感谢
这就是我想知道的。谢谢。 – JRaSH 2012-04-16 11:30:22
如果您需要整个Key/Value对象,则只需克隆对象;否则,如果您只需要添加到StringBuffer的某些内容,则无问题。不要忘记添加清理方法(我忘记了要覆盖的名称),以便在Map调用之间缓冲或写入Reducer,否则最终会有一些数据永远不会发送到Reducers。 – Drizzt321 2012-04-16 23:22:45