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

#java #apache-spark #spark-streaming

#java #apache-spark #искровая передача

Вопрос:

Я пытаюсь выполнить пример 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. вы ничего не делаете с потоком, просто выполните операцию над ним, и все готово

Ответ №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.Ошибка утверждения: ошибка утверждения: не зарегистрированы потоки вывода, поэтому нечего выполнять

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

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

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

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

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

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

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


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

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

Ответ №3:

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