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

时间:2014-07-01 21:37:35

标签: java apache-spark spark-streaming

我正在尝试使用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 个答案:

答案 0 :(得分:38)

  

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

在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

如果需要,您也可以先应用任何转换然后输出功能。

答案 1 :(得分:2)

  

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

TL; DR 使用其中一个可用print saveAsTextFilesforeachRDDsaveAsObjectFiles(或更少使用saveAsHadoopFiles }或JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters); // --> The output operator here <-- jssc.start(); )。

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

print

引用Spark官方文档&#39; output operators(突出我的):

  

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

关键是如果没有输出操作符,则&#34;没有注册输出流,因此无需执行任何操作&#34;

正如一位评论者注意到的那样,您必须使用输出转换,例如:在foreachRDD开始之前StreamingContextprint

在内部,无论何时使用其中一个可用的输出运算符,例如foreach要求DStreamGraphSELECT LEFT(a.cusip, 6) AS cusip6, a.date, a.prc, a.ret, a.vol, a.spread, a.shrout, b.epsf12, (b.seqq-b.pstkq) / b.cshoq AS bps FROM crsp.msf a FULL JOIN compa.fundq b ON (LEFT(a.cusip, 6) = LEFT(b.cusip, 6) AND a.date = b.datadate) WHERE (b.datadate BETWEEN '2010-01-01' and '2015-12-31') AND (a.date BETWEEN '2010-01-01' and '2015-12-31') AND (b.cshoq > 0) SELECT LEFT(cusip, 6) AS cusip6, date, prc, ret, vol, spread, shrout FROM crsp.msf WHERE date BETWEEN '2010-01-01' and '2015-12-31' SELECT LEFT(cusip, 6) AS cusip6, datadate AS date, epsf12, (seqq-pstkq)/cshoq AS bps FROM compa.fundq WHERE datadate BETWEEN '2010-01-01' and '2015-12-31' AND cshoq > 0 {/ 3}}。

您可以在Output Operations on DStreams之后找到注册(正好是add an output stream)。

答案 2 :(得分:1)

它也 - 错误地 - 未能指出此问题,但真正的原因是来自流媒体的幻灯片窗口持续时间之间的非多个数字输入和RDD时间窗口。 仅记录警告:您修复它,上下文停止失败:D

相关问题