我正在初始化累加器
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值就会被设置。
答案 0 :(得分:7)
累加器是仅通过“添加”的变量 因此可以有效地支持关联操作 平行。它们可用于实现计数器(如MapReduce)或 总和
...
只有驱动程序程序可以使用它来读取累加器的值
value
方法。
因此,当尝试从Spark中的任务中读取累加器的值时,意味着您尝试从工作程序读取其值,这与仅从驱动程序读取累加器值的概念相反。