为什么不能从另一个Spark函数内部访问自动装配的Spark函数

时间:2016-12-09 08:24:26

标签: apache-spark spark-streaming

我在另一个Spark Function f2中使用Spark过滤器函数f1(call()方法)。我正在自动装配函数对象f1。但这最终会导致Task Not Serializable。然后,当我将此对象分配给另一个局部变量时,它工作正常。我无法弄清楚我在这里做错了什么,但感觉我对此有误解。

下面,我提供了有效的代码。

这是过滤功能(f1):

@Bean(name = "lengthFilter")
public Function<String, Boolean> lengthFilter(@Value("${record.length:31}") String recordLength){
    return i -> !Strings.isNullOrEmpty(i) && i.length() == Integer.valueOf(recordLength);
}

不工作代码:

@Autowired
@Qualifier("lengthFilter")
private Function<String, Boolean> lengthFilter;

JavaDStream<String> records = messages.map(t -> t._2());


records.mapToPair(s -> {

        if(lengthFilter.call(s)) {
            return new Tuple2<>(s.substring(0,2), s);
        } else {
            return new Tuple2<>("default", s);
        }

    });

此代码抛出Spark Exception,表示该任务不是Serializable。

工作代码:

@Autowired
@Qualifier("lengthFilter")
private Function<String, Boolean> lengthFilter;


Function<String,Boolean> lengthFilterLocal = lengthFilter;

JavaDStream<String> records = messages.map(t -> t._2());


records.mapToPair(s -> {

    if(lengthFilterLocal.call(s)) {
        return new Tuple2<>(s.substring(0,2), s);
    } else {
        return new Tuple2<>("default", s);
    }

});

第一个失败,异常表示任务无法序列化,而第二个成功执行。两个代码之间的唯一区别在于,在第二个代码中,自动装配的函数被分配给局部变量,并且该变量是从mapToPair()内部访问的。我想知道这背后的原因是什么,或者我哪里出错。

0 个答案:

没有答案