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

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

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

Réponse courte:

Pour forcer Spark à exécuter une transformation, vous devez demander un résultat. Parfois, une simple action de count suffit.

TL; DR:

Ok, passons en revue les opérations de RDD .

RDD prennent en charge deux types d’opérations:

  • transformations – qui créent un nouveau jeu de données à partir d’un existant.
  • actions – qui renvoient une valeur au programme pilote après l’exécution d’un calcul sur l’dataset.

Par exemple, map est une transformation qui transmet chaque élément de jeu de données à une fonction et renvoie un nouveau RDD représentant les résultats. D’autre part, reduce est une action qui regroupe tous les éléments du RDD en utilisant une fonction et renvoie le résultat final au programme du pilote (bien qu’il existe également une reduceByKey parallèle, qui retourne un jeu de données dissortingbué).

Toutes les transformations dans Spark sont paresseuses , en ce sens qu’elles ne calculent pas leurs résultats immédiatement .

Au lieu de cela, ils se souviennent simplement des transformations appliquées à un dataset de base (un fichier, par exemple). Les transformations ne sont calculées que lorsqu’une action nécessite qu’un résultat soit renvoyé au programme de pilote. Cette conception permet à Spark de fonctionner plus efficacement – par exemple, nous pouvons nous rendre compte qu’un jeu 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 jeu de données mappé.

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 à l’aide de la méthode persist (ou cache ). Dans ce cas, Spark conservera les éléments sur le cluster pour un access beaucoup plus rapide la prochaine fois que vous l’interrogerez. Il existe également un support pour les RDD persistants sur le disque ou répliqués sur plusieurs nœuds.

Conclusion

Pour forcer Spark à exécuter un appel à la carte, vous devez demander un résultat. Parfois, une action de count suffit.

Référence

  • Guide de programmation Spark .

Les transformations d’ étincelles décrivent uniquement 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 le but est de créer un effet secondaire, tel que le stockage de données sur HDFS, la méthode à utiliser est la bonne. C’est à la fois une action et une sémantique propre. Ce qui est également important, contrairement à la map , n’implique pas de transparence référentielle.