运行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);
}
完美无缺。
我知道其中一个原因是sparkConf
和jssc
需要static
。但我不明白为什么。
有人可以解释这个区别吗?
答案 0 :(得分:1)
JavaStreamingContext和SparkConf都没有实现Serializable。
如果没有此接口,则无法序列化类的实例。
静态成员不会被序列化。
可在此处找到更多信息:
http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html