我想概括一下我的看法。在设置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从接收方和分析数据的部分分离出来?