在 Spark Streaming 中将 StreamingContext 与 Receiver 分开
Separate StreamingContext from Receiver in Spark Streaming
我想概括一下我的 Main.设置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 与接收器和分析数据的部分分开吗?
OP 的解决方案。
我只需要在 OtherClass.java 中实现 Serializable (java.io)。显然它对每个环境都是必需的,包括在本地环境中。
我想概括一下我的 Main.设置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 与接收器和分析数据的部分分开吗?
OP 的解决方案。
我只需要在 OtherClass.java 中实现 Serializable (java.io)。显然它对每个环境都是必需的,包括在本地环境中。