Почему запуск StreamingContext завершается с ошибкой "IllegalArgumentException: требование не выполнено: никаких операций вывода не зарегистрировано, поэтому ничего не выполнить"?

Я пытаюсь выполнить пример Spark Streaming с Twitter в качестве источника следующим образом:

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

Он также - не всегда обвиняет эту проблему, но реальная причина - это non multiple numbers между длинами окон слайдов из потокового ввода и временными окнами RDD. Он регистрирует только предупреждение: вы его исправляете, а контекст останавливается: D

Ответ 3

Исключение в потоке "main" java.lang.AssertionError: утверждение не выполнено: никаких потоков вывода не зарегистрировано, поэтому ничего не выполнить

TL; DR Используйте один из доступных операторов вывода, например print, saveAsTextFiles или foreachRDD (или реже используется saveAsObjectFiles или saveAsHadoopFiles).

Другими словами, вы должны использовать оператор вывода между следующими строками в вашем коде:

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

Цитирование официальной документации Spark Операции вывода на DStreams (выделение моей):

Операции вывода позволяют выводить данные DStream во внешние системы, такие как база данных или файловые системы. Поскольку выходные операции фактически позволяют преобразованным данным потреблять внешние системы, они запускают фактическое выполнение всех преобразований DStream (аналогично действиям для RDD).

Дело в том, что без оператора вывода у вас нет "зарегистрированных потоков вывода", поэтому ничего не нужно выполнять ".

Как заметил один из комментаторов, вы должны использовать выходное преобразование, например. print или foreachRDD, перед запуском StreamingContext.


Внутренне, всякий раз, когда вы используете один из доступных операторов вывода, например. print или foreach, DStreamGraph запрашивается добавить выходной поток.

Вы можете найти регистрацию, когда после новый ForEachDStream будет создан и зарегистрирован (что точно соответствует добавить его как выходной поток).