在单线程中执行级联功能作为hadoop映射器功能吗?

时间:2013-06-10 07:44:40

标签: hadoop mapreduce cascading

我正在阅读级联文档章节5.2函数,我想知道下面的代码会发生什么。它应该在多线程环境中正常工作吗? 更一般的问题是函数可能是多线程的吗?据我所知,单个映射器是单线程的。

具体来说,我已经测试了这样的代码,在我看来,这不是线程安全的。也许我对第39页的文档没有正确理解。

public class NotThreadSafeObject{ 
 ...
 public void doSomething(){
       // update state
 }
 public String getValue(){
       // returns value from state 
 }
public class SomeFunction extends BaseOperation<Tuple> implements Function<Tuple>
 {
    // constructors
   @Override
   public void prepare( FlowProcess flowProcess, OperationCall<Tuple> call )
   {
   // create a reusable Object with state of size 1
    call.setContext( new NotThreadSafeObject() );
   }

   public void operate( FlowProcess flowProcess, FunctionCall<Tuple> call )
   {
     // ...
     NotThreadSafeObject obj = call.getContext();
     obj.doSomething(); 
     Tuple tup = new Tuple();
     tup.set(0,obj.getValue());  
     call.getOutputCollector().add(tup);
   }

   @Override
   public void cleanup( FlowProcess flowProcess, OperationCall<Tuple> call )
   {
      call.setContext( null );
   }
}

1 个答案:

答案 0 :(得分:1)

基于Cascading documentation,这应该可以正常工作,实际上是在非聚合操作中使用Context的主要原因。