Spark Accumulator值未被任务读取

时间:2016-03-14 09:31:51

标签: java apache-spark rdd

我正在初始化累加器

final Accumulator<Integer> accum = sc.accumulator(0);

然后在map函数中,我试图递增累加器,然后在设置变量时使用累加器值。

JavaRDD<UserSetGet> UserProfileRDD1 = temp.map(new Function<String, UserSetGet>() {

            @Override
            public UserSetGet call(String arg0) throws Exception {

                    UserSetGet usg = new UserSetGet();

                    accum.add(1);
                    usg.setPid(accum.value().toString();


            }
  });

但我得到以下错误。

  

16/03/14 09:12:58 ERROR executor.Executor:任务0.0中的异常   stage 2.0(TID 2)java.lang.UnsupportedOperationException:无法读取   任务中的累加器值

已编辑 - 根据Avihoo Mamka的回答,无法在任务中获得累加器值。

无论如何,我可以并行实现同样的目标。这样每次变量(例如像静态变量)在我的map函数中递增时,Pid值就会被设置。

1 个答案:

答案 0 :(得分:7)

来自Spark docs

  

累加器是仅通过“添加”的变量   因此可以有效地支持关联操作   平行。它们可用于实现计数器(如MapReduce)或   总和

     

...

     

只有驱动程序程序可以使用它来读取累加器的值   value方法。

因此,当尝试从Spark中的任务中读取累加器的值时,意味着您尝试从工作程序读取其值,这与仅从驱动程序读取累加器值的概念相反。