J'ai le travail d'étincelle suivant, en essayant de tout garder en mémoire:
val myOutRDD = myInRDD.flatMap { fp =>
val Tuple2List: ListBuffer[(String, myClass)] = ListBuffer()
:
Tuple2List
}.persist(StorageLevel.MEMORY_ONLY).reduceByKey { (p1, p2) =>
myMergeFunction(p1,p2)
}.persist(StorageLevel.MEMORY_ONLY)
Cependant, quand j'ai regardé dans l'outil de suivi des tâches, il me reste beaucoup d'écriture aléatoire et d'écriture aléatoire sur le disque ...
Total task time across all tasks: 49.1 h
Input Size / Records: 21.6 GB / 102123058
Shuffle write: 532.9 GB / 182440290
Shuffle spill (memory): 370.7 GB
Shuffle spill (disk): 15.4 GB
Ensuite, le travail a échoué parce que "no space left on device"
... Je me demande pour le 532.9 GB Shuffle write here, est-il écrit sur le disque ou dans la mémoire?
Aussi, pourquoi y at-il encore des pertes de données de 15,4 G sur le disque alors que je demande spécifiquement de les garder en mémoire?
Merci!
Lecture aléatoire (mémoire) est la taille de la forme désérialisée des données en mémoire au moment où nous la répandons, alors que lecture aléatoire (disque) est la taille de la forme sérialisée des données sur disque après que nous le renversons. C'est pourquoi ce dernier a tendance à être beaucoup plus petit que le premier. Notez que les deux métriques sont agrégées sur toute la durée de la tâche (c.-à-d. Que vous pouvez renverser plusieurs fois dans chaque tâche).
Les appels persist
de votre code sont entièrement perdus si vous n’accédez pas plusieurs fois au RDD. Quel est l'intérêt de stocker quelque chose si vous n'y accédez jamais? La mise en cache n'a pas d'incidence sur le comportement de lecture aléatoire, si ce n'est que vous pouvez éviter de répéter cette opération en conservant leur sortie en cache.
Le déversement aléatoire est contrôlé par les paramètres spark.shuffle.spill
ET spark.shuffle.memoryFraction
. Si spill
est activé (c'est par défaut), les fichiers aléatoires seront renversés sur le disque s'ils commencent à utiliser plus que ce qui est donné par memoryFraction
(20% par défaut).
Les métriques sont très déroutantes. Ma lecture du code est que "Shuffle spill (memory)" est la quantité de mémoire libérée au fur et à mesure que les choses se sont répandues sur le disque. Le code for "Shuffle spill (disk)" ressemble à la quantité réellement écrite sur le disque. Par le code for "Shuffle write", je pense que c’est le montant écrit directement sur le disque - pas comme un déversement de la part d’une trieuse.
Encore une remarque sur la façon de prévenir les renversements aléatoires, car j'estime que c'est la partie la plus importante de la question du point de vue de la performance (l'écriture aléatoire, comme mentionné ci-dessus, est une partie obligatoire du réarrangement).
Le renversement se produit lors de la lecture lors de la lecture aléatoire, aucun réducteur ne peut contenir tous les enregistrements qui lui sont affectés en mémoire dans l'espace de lecture aléatoire de cet exécuteur. Si votre lecture aléatoire est déséquilibrée (par exemple, certaines partitions de sortie sont beaucoup plus grandes que certaines partitions d'entrée), vous pouvez avoir un déversement aléatoire même si les partitions «tiennent en mémoire» avant la lecture aléatoire. La meilleure façon de contrôler cela est de A) d’équilibrer la lecture aléatoire, par exemple en changeant votre code pour réduire avant de mélanger ou en mélangeant différentes clés ou B) modifier les paramètres de la mémoire aléatoire comme suggéré ci-dessus Compte tenu de l'ampleur du débordement sur le disque, vous devrez probablement effectuer A plutôt que B.
L'écriture aléatoire désigne les données qui ont été écrites sur votre système de fichiers local dans un emplacement de cache temporaire. En mode grappe de fils, vous pouvez définir cette propriété avec l'attribut "yarn.nodemanager.local-dirs" dans yarn-site.xml. Par conséquent, "écriture aléatoire" signifie la taille des données que vous avez écrites dans l'emplacement temporaire; Un "déversement aléatoire" est plus susceptible de votre résultat de stade de mélange aléatoire. Quoi qu'il en soit, ces chiffres sont accumulés.