首页 文章

为什么启动StreamingContext失败并出现“IllegalArgumentException:要求失败:没有注册输出操作,所以无需执行”?

提问于
浏览
19

我正在尝试使用Twitter作为源执行Spark Streaming示例,如下所示:

public static void main (String.. args) {

    SparkConf conf = new SparkConf().setAppName("Spark_Streaming_Twitter").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);       
        JavaStreamingContext jssc = new JavaStreamingContext(sc, new Duration(2));      
        JavaSQLContext sqlCtx = new JavaSQLContext(sc);     


        String[] filters = new String[] {"soccer"};

        JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);



         jssc.start();
         jssc.awaitTermination();

}

但我得到以下例外

Exception in thread "main" java.lang.AssertionError: assertion failed: No output streams registered, so nothing to execute
    at scala.Predef$.assert(Predef.scala:179)
    at org.apache.spark.streaming.DStreamGraph.validate(DStreamGraph.scala:158)
    at org.apache.spark.streaming.StreamingContext.validate(StreamingContext.scala:416)
    at org.apache.spark.streaming.StreamingContext.start(StreamingContext.scala:437)
    at org.apache.spark.streaming.api.java.JavaStreamingContext.start(JavaStreamingContext.scala:501)
    at org.learning.spark.TwitterStreamSpark.main(TwitterStreamSpark.java:53)

有任何建议如何解决这个问题?

3 回答

  • 2

    调用输出运算符时,它会触发流的计算 .

    如果没有DStream上的输出操作符,则不会调用任何计算 . 基本上你需要在流上调用以下任何方法

    print()
    foreachRDD(func)
    saveAsObjectFiles(prefix, [suffix])
    saveAsTextFiles(prefix, [suffix])
    saveAsHadoopFiles(prefix, [suffix])
    

    http://spark.apache.org/docs/latest/streaming-programming-guide.html#output-operations

    您也可以先应用任何转换,然后根据需要输出函数 .

  • 36

    线程“main”中的异常java.lang.AssertionError:断言失败:没有注册输出流,因此无需执行

    TL;DR 使用output operators之类的可用output operatorssaveAsTextFilesforeachRDD (或不常用的 saveAsObjectFilessaveAsHadoopFiles ) .

    换句话说,您必须在代码中的以下行之间使用输出运算符:

    JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);
    // --> The output operator here <--
    jssc.start();
    

    引用Spark官方文档的Output Operations on DStreams(突出显示我的):

    输出操作允许将DStream的数据推送到外部系统,如数据库或文件系统 . 由于输出操作实际上允许外部系统使用转换后的数据,因此它们会触发所有DStream转换的实际执行(类似于RDD的操作) .

    关键是没有输出操作符,你有"no output streams registered, so nothing to execute" .

    正如一位评论者注意到的那样,你必须使用输出转换,例如: printforeachRDD ,在启动 StreamingContext 之前 .


    在内部,无论何时使用其中一个可用的输出运算符,例如 printforeachDStreamGraph 被请求add an output stream .

    您可以在new ForEachDStream is created and registered之后找到注册(这正好是add it as an output stream) .

  • 1

    它也 - 错误地 - 没有指责这个问题,但 the real cause 是来自流输入的滑动窗口持续时间和RDD时间窗口之间的 non multiple numbers . It only logs a warning :你修复它,上下文停止失败:D

相关问题