我想在我的主要部分概括接待。设置SparkConf和JavaContextStreaming后,我想收到一个任意对象,然后将其传递给分析器。
在下面的情况中,我得到一个例外:任务不可序列化
Main.java
/**
*
**/
SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("MyApp");
JavaStreamingContext jsc = new JavaStreamingContext(conf, BATCH_DURATION);
JavaReceiverInputDStream<String> input = jsc.socketTextStream(HOST, PORT);
OtherClass.analyze(input);
/*
*/
jsc.start();
jsc.awaitTermination();
jsc.close();
OtherClass.java
/**
*
**/
public void analyze(JavaReceiverInputDStream<String> input){
JavaPairDStream<String, String> events = input.mapToPair( ...);
// other code
//
// Task not serializable (at the line where I call lines.mapToPair(...))
//
}
我也试过把接收器放在方法中,我在同一行得到相同的结果。
Main.java
/**
*
**/
SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("MyApp");
JavaStreamingContext jsc = new JavaStreamingContext(conf, BATCH_DURATION);
OtherClass.analyze(jsc);
/*
*/
OtherClass.java
/**
*
**/
public void analyze(JavaStreamingContext jsc){
JavaReceiverInputDStream<String> input = jsc.socketTextStream(HOST, PORT);
JavaPairDStream<String, String> events = input.mapToPair( ...);
// other code
//
// Task not serializable (at the line where I call lines.mapToPair(...))
//
jsc.start();
jsc.awaitTermination();
jsc.close();
}
有一种方法可以从分析数据的逻辑部分中分离接收器(在本例中为JavaReceiverInputDStream,但很容易就是JavaDStream)?或者,有一种方法可以将JavaStreamingContext表单与接收器和分析数据的部分分开吗?
答案 0 :(得分:0)
OP解决方案。
我只需要在OtherClass.java中实现Serializable(java.io)。显然,这对每个环境都是必要的,包括在当地环境中。