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

Я пытаюсь выполнить пример потоковой передачи Spark с 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)

любое предложение, как исправить эту проблему?

3 ответов


когда вызывается выходной оператор, он запускает вычисление поток.

без оператора вывода на DStream вычисление не вызывается. в основном вам нужно будет вызвать любой из приведенных ниже методов в stream

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

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

вы также можете сначала применить любые преобразования, а затем при необходимости вывести функции.


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


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

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

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

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

со ссылкой на СПАРК официальная документация операции вывода на DStreams (выделение мое):

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

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

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


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

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