web-dev-qa-db-fra.com

Comment puis-je forcer Spark pour exécuter du code?

Comment puis-je forcer Spark à exécuter un appel à la carte, même s'il pense qu'il n'a pas besoin d'être exécuté en raison de son évaluation paresseuse?

J'ai essayé de mettre cache() avec l'appel de carte mais cela ne fait toujours pas l'affaire. Ma méthode de carte télécharge en fait les résultats sur HDFS. Donc, ce n'est pas inutile, mais Spark le pense.

28
MetallicPriest

Réponse courte:

Pour forcer Spark pour exécuter une transformation, vous devrez exiger un résultat. Parfois, une simple action count suffit.

TL; DR:

Ok, passons en revue les opérations RDD.

RDDs supporte deux types d'opérations:

  • transformations - qui créent un nouvel ensemble de données à partir d'un existant.
  • actions - qui renvoient une valeur au programme pilote après avoir exécuté un calcul sur l'ensemble de données.

Par exemple, map est une transformation qui passe chaque élément de l'ensemble de données via une fonction et renvoie un nouveau RDD représentant les résultats. D'un autre côté, reduce est une action qui agrège tous les éléments du RDD à l'aide d'une fonction et renvoie le résultat final au programme pilote (bien qu'il existe également un reduceByKey parallèle qui renvoie un ensemble de données distribué).

Toutes les transformations en Spark sont paresseuses , en ce que elles ne calculent pas leurs résultats tout de suite.

Au lieu de cela, ils se souviennent simplement des transformations appliquées à un ensemble de données de base (par exemple, un fichier). Les transformations ne sont calculées que lorsqu'une action nécessite un résultat à renvoyer au programme pilote. Cette conception permet à Spark de s'exécuter plus efficacement - par exemple, nous pouvons réaliser qu'un ensemble de données créé via la carte sera utilisé dans une réduction et ne renverra que le résultat de la réduction au pilote, plutôt que le plus grand ensemble de données cartographiées.

Par défaut, chaque RDD transformé peut être recalculé chaque fois que vous exécutez une action dessus. Cependant, vous pouvez également conserver un RDD en mémoire en utilisant la méthode persist (ou cache), auquel cas Spark conservera le éléments autour du cluster pour un accès beaucoup plus rapide la prochaine fois que vous l'interrogez. Il est également possible de conserver les RDDs persistants sur le disque ou répliqués sur plusieurs nœuds.

Conclusion

Pour forcer Spark pour exécuter un appel à la carte, vous devrez exiger un résultat. Parfois, une action count est suffisante.

Référence

33
eliasah

Spark transformations ne décrit que ce qui doit être fait. Pour déclencher une exécution, vous avez besoin d'une action .

Dans votre cas, il y a un problème plus profond. Si l'objectif est de créer une sorte d'effet secondaire, comme le stockage de données sur HDFS, la bonne méthode à utiliser est foreach. C'est à la fois une action et une sémantique propre. Ce qui est également important, contrairement à map, cela n'implique pas la transparence référentielle.

14
zero323