为什么static关键字“修复”Task的问题不可序列化?

时间:2015-11-20 22:21:48

标签: java serialization apache-spark

运行spark streaming时遇到“task not serializable”问题。原因可以在thread中找到。

在我尝试了几种方法并修复了问题之后,我不明白它为什么会起作用。

public class StreamingNotWorking implements Serializable {

private SparkConf sparkConf;
private JavaStreamingContext jssc;

public StreamingNotWorking(parameter) {
    sparkConf = new SparkConf();
    this.jssc = createContext(parameter);
    JavaDStream<String> messages = functionCreateStream(parameter);
    messages.print();
}
public void run() {
    this.jssc.start();
    this.jssc.awaitTermination();
}

public class streamingNotWorkingDriver {

        public static void main(String[] args) {
            Streaming bieventsStreaming = new StreamingNotWorking(parameter);
            bieventsStreaming.run();
        }

会给出相同的“Task not serializable”错误。

但是,如果我将代码修改为:

public class StreamingWorking implements Serializable {

    private static SparkConf sparkConf;
    private static JavaStreamingContext jssc;

    public void createStream(parameter) {
        sparkConf = new SparkConf();
        this.jssc = createContext(parameter);
        JavaDStream<String> messages = functionCreateStream(parameter);
        messages.print();
        run();
    }
    public void run() {
        this.jssc.start();
        this.jssc.awaitTermination();
    }

    public class streamingWorkingDriver {

            public static void main(String[] args) {
                Streaming bieventsStreaming = new StreamingWorking();
                bieventsStreaming.createStream(parameter);
            }

完美无缺。

我知道其中一个原因是sparkConfjssc需要static。但我不明白为什么。

有人可以解释这个区别吗?

1 个答案:

答案 0 :(得分:1)

JavaStreamingContext和SparkConf都没有实现Serializable。

如果没有此接口,则无法序列化类的实例。

静态成员不会被序列化。

可在此处找到更多信息:

http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html