为什么启动 StreamingContext 会失败,并显示“IllegalArgumentException: require failed: no output operations registered, 所以没有执行”?

2022-09-01 15:28:59

我正在尝试以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)

任何建议如何解决此问题?


答案 1

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

如果 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

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


答案 2

线程“main” java.lang.Assertion中的异常错误:断言失败:没有注册输出流,因此没有要执行的内容

TL;DR使用可用的输出运算符之一,如 、或(或不太常用的 或 )。printsaveAsTextFilesforeachRDDsaveAsObjectFilessaveAsHadoopFiles

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

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

引用 Spark 官方文档在 DStream 上的输出操作(突出显示我的):

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

关键是,如果没有输出运算符,您“没有注册输出流,因此无需执行任何内容”。

正如一位评论者所注意到的,您必须使用输出转换,例如 或 ,在启动 .printforeachRDDStreamingContext


在内部,每当您使用其中一个可用的输出运算符时,例如 或 ,请求添加输出流printforeachDStreamGraph

您可以在创建新的 ForEachDStream 并在之后注册时找到注册(这正好是将其添加为输出流)。


推荐