web-dev-qa-db-fra.com

Pourquoi le démarrage de StreamingContext échoue avec «IllegalArgumentException: l'exigence a échoué: aucune opération de sortie enregistrée, donc rien à exécuter»?

J'essaie d'exécuter un Spark exemple de streaming avec Twitter comme source comme suit:

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();

}

Mais je reçois l'exception suivante

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)

Une suggestion sur la façon de résoudre ce problème?

23
Ananth Duari

Lorsqu'un opérateur de sortie est appelé, il déclenche le calcul d'un flux.

Sans opérateur de sortie sur DStream, aucun calcul n'est appelé. en gros, vous devrez invoquer l'une des méthodes ci-dessous en flux

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

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

vous pouvez également d'abord appliquer des transformations, puis générer des fonctions si nécessaire.

41
Jigar Parekh

Exception dans le thread "principal" Java.lang.AssertionError: échec de l'assertion: aucun flux de sortie enregistré, donc rien à exécuter

TL; DR Utilisez l'un des opérateurs de sortie disponibles comme print, saveAsTextFiles ou foreachRDD (ou moins souvent utilisé saveAsObjectFiles ou saveAsHadoopFiles).

En d'autres termes, vous devez utiliser un opérateur de sortie entre les lignes suivantes dans votre code:

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

Citant les opérations de sortie de la documentation officielle Spark sur DStreams (mettant en évidence la mienne):

Les opérations de sortie permettent aux données de DStream d'être transférées vers des systèmes externes comme une base de données ou un système de fichiers. Étant donné que les opérations de sortie permettent réellement aux données transformées d'être consommées par des systèmes externes, elles déclenchent l'exécution réelle de toutes les transformations DStream (similaires aux actions pour les RDD) .

Le fait est que sans opérateur de sortie, vous avez "aucun flux de sortie enregistré, donc rien à exécuter".

Comme un commentateur l'a remarqué, vous devez utiliser une transformation de sortie, par exemple print ou foreachRDD, avant de démarrer StreamingContext.


En interne, chaque fois que vous utilisez l'un des opérateurs de sortie disponibles, par exemple print ou foreach, DStreamGraph est invité à ajouter un flux de sortie .

Vous pouvez trouver l'enregistrement lorsqu'un nouveau ForEachDStream est créé et enregistré par la suite (ce qui correspond exactement à l'ajouter en tant que flux de sortie ) .

2
Jacek Laskowski

Il a également - à tort - échoue à accuser ce problème, mais la véritable cause est le nombres non multiples = entre les durées de la fenêtre de diapositive de l'entrée de streaming et les fenêtres temporelles RDD Il n'enregistre qu'un avertissement: vous le corrigez, et le contexte cesse d'échouer: D

1
user1995400