在 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)。显然它对每个环境都是必需的,包括在本地环境中。