Lorsque les accumulateurs sont vraiment fiables?

Je veux utiliser un accumulateur à recueillir des statistiques sur les données, je suis la manipulation sur une Étincelle d'emploi. Idéalement, je voudrais faire tout le travail calcule les transformations nécessaires, mais depuis Étincelle re-calculer les tâches dans les différents cas, les accumulateurs ne rendrait pas compte de vraies mesures. Voici comment la documentation décrit ceci:

Pour accumulateur mises à jour effectuées à l'intérieur des actions seulement, Étincelle
garantit que chaque tâche de mise à jour de l'accumulateur ne seront
appliquer une fois, c'est à dire redémarré tâches ne seront pas de mise à jour de la valeur. Dans
les transformations, les utilisateurs doivent être conscients que chaque tâche de mise à jour peut
être appliqué plus d'une fois si les tâches ou étapes sont ré-exécuté.

Ceci est source de confusion puisque la plupart des actions ne pas permettre l'exécution de code personnalisé (où les accumulateurs peuvent être utilisés), ils ont surtout prendre les résultats de précédentes transformations (paresseusement). La documentation indique également ceci:

val acc = sc.accumulator(0)
data.map(x => acc += x; f(x))
//Here, acc is still 0 because no actions have cause the `map` to be computed.

Mais si l'on ajoute data.count() à la fin, serait-ce la garantie d'être correct (ont pas de doublons) ou pas? Clairement acc n'est pas utilisée "à l'intérieur que des actions", que la carte est une transformation. Donc, il ne devrait pas être garanti.

D'autre part, la discussion sur les tickets Jira parler de "résultat des tâches" plutôt que des "actions". Par exemple ici et ici. Cela semble indiquer que le résultat serait en effet garanti pour être correct, puisque nous sommes à l'aide de acc immédiatement avant et à l'action, et devrait donc être calculée comme une seule étape.

Je suppose que cette notion de "résultat de la tâche de" a à voir avec le type d'exploitation concerné, étant le dernier, qui comprend une action, comme dans cet exemple qui montre comment plusieurs opérations sont divisés en étapes (en magenta, image prise à partir de ici):

Lorsque les accumulateurs sont vraiment fiables?

Donc, hypothétiquement, une count() action à la fin de cette chaîne serait partie de la même étape finale, et je voudrais être garanti que les accumulateurs utilisés sur la dernière carte n'inclut aucune des doublons?

Clarification autour de cette question serait génial! Merci.

  • Eh bien, bounty période terminée et je n'ai toujours pas vraiment connaître la vraie réponse, de sorte que l'attribution à la plus commentée de réponse à ce jour :-S
  • les données.le comte ne s'exécutera pas de données.carte(...) mais cela va faire >>>val data2 = données.carte(x => acc += x; f(x)) >>>données2.count()