在Spark Streaming中从Receiver中分离StreamingContext

时间:2018-02-20 16:06:26

标签: java apache-spark spark-streaming

我想在我的主要部分概括接待。设置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表单与接收器和分析数据的部分分开吗?

1 个答案:

答案 0 :(得分:0)

OP解决方案。

我只需要在OtherClass.java中实现Serializable(java.io)。显然,这对每个环境都是必要的,包括在当地环境中。