代码之家  ›  专栏  ›  技术社区  ›  Francesco

在Spark Streaming中将StreamingContext与接收器分离

  •  1
  • Francesco  · 技术社区  · 7 年前

    我想概括一下我的看法。在设置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 回复  |  直到 7 年前
        1
  •  0
  •   Cœur    7 年前

    OP解决方案。

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