/ / Opérations simultanées en flux continu - apache-spark, spark-streaming

Opérations simultanées en flux continu - apache-spark, spark-streaming

Je voulais comprendre quelque chose sur le fonctionnement interne des exécutions en continu.

Si j'ai un flux X, et dans mon programme, j'envoie le flux X aux fonctions A et B:

  1. Dans la fonction A, je fais quelques opérations de transformation / filtrage, etc. sur X-> Y-> Z pour créer le flux Z. Maintenant, je fais une opération forEach sur Z et j'imprime la sortie dans un fichier.

  2. Ensuite, dans la fonction B, je réduis le flux X -> X2 (par exemple, la valeur minimale de chaque RDD), et j'imprime la sortie dans un fichier.

Les deux fonctions sont-elles exécutées pour chaque RDD en parallèle? Comment ça marche?

Merci

--- Commentaires de Spark Community ----

J'ajoute des commentaires de la communauté des étincelles -

Si vous exécutez l’étape de collecte (foreach dans 1,éventuellement réduire en 2) dans deux threads du pilote, les deux seront exécutés en parallèle. Quel que soit le fichier soumis à Spark, il est d'abord exécuté: vous pouvez utiliser un sémaphore pour assurer l'ordre d'exécution, bien que je suppose que cet ordre n'aurait pas d'importance.

Réponses:

0 pour la réponse № 1

La réponse de @Eswara semble juste, mais elle ne s’applique pas à votre cas d’utilisation car vos DAG de transformation distinctes (X->Y->Z et X->X2) ont un ancêtre commun DStream dans X. Cela signifie que lorsque les actions sont exécutées pour déclencher chacun de ces flux, la transformation X->Y et la transformation X->X2 ne peux pas arriver en même temps. Qu'est-ce qui se passera est les partitions pour RDD X seront calculés ou chargés à partir de la mémoire (si mis en cache) pour chacune de ces transformations séparément de manière non parallèle.

Idéalement, ce qui arriverait, c’est que la transformation X->Y résoudrait et ensuite les transformations Y->Z et X->X2 finirait en parallèle car il n'y a pas d'état partagé entre eux. Je pense que l’architecture de pipeline de Spark pourrait être optimisée. Vous pouvez ainsi accélérer les calculs sur X->X2 en persistant DStream X afin qu'il puisse être chargé à partir de la mémoire plutôt que d'être recalculé ou chargé à partir du disque. Voir ici pour plus d'informations sur la persistance.

Ce qui serait intéressant si vous pouviez fournir les niveaux de stockage de réplication *_2 (par exemple. MEMORY_ONLY_2 ou MEMORY_AND_DISK_2) pour pouvoir exécuter des transformations simultanément sur la même source. Je pense que ces niveaux de stockage sont actuellement seulement utile contre les partitions perdues maintenant, la partition dupliquée sera traitée à la place de la partition perdue.


0 pour la réponse № 2

Oui. Son modèle d’exécution est similaire à celui de spark, qui utilise des DAG et une évaluation lente, à la différence que la diffusion en continu exécute le DAG de manière répétée sur chaque nouveau lot de données. Dans votre cas, puisque les DAG (ou les sous-DAG du plus grand DAG, si l’on préfère appeler ainsi) doivent terminer chaque action (chacun des 2 pour chaques vous avez) ne pas avoir des liens communs tout le cheminde retour jusqu'à la source, ils fonctionnent complètement en parallèle.L'application en continu dans son ensemble obtient X exécuteurs (JVM) et Y cœurs (threads) attribués au moment de la soumission de l'application au gestionnaire de ressources. À tout moment, une tâche donnée (c'est-à-dire , thread) dans X * Y tâches exécutera une partie ou la totalité de un Notez que 2 threads donnés d'une application, que ce soit dans le même exécuteur ou autrement, peuvent exécuter différentes actions de la même application en même temps.