Spark: Différence entre le Shuffle d'Écriture, de lecture Aléatoire de déversement (de mémoire), Shuffle déversement (disque)?
J'ai le texte suivant étincelle de l'emploi, en essayant de garder tout 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, lorsque j'ai regardé dans le tracker d'emploi, j'ai encore beaucoup de lecture Aléatoire d'Écriture et de lecture Aléatoire de déversement 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
Puis le travail a échoué parce que "no space left on device"
... je me demande pour le 532.9 GO Shuffle écrire ici, est-il écrit sur le disque ou la mémoire?
Aussi, pourquoi il y a encore de 15,4 G data déversement sur le disque alors que j'ai demander spécifiquement pour les garder dans la mémoire?
Merci!
OriginalL'auteur Edamame | 2015-08-25
Vous devez vous connecter pour publier un commentaire.
Shuffle déversement (de mémoire) est la taille de la désérialisé de la forme des données dans la mémoire au moment où nous renverser, alors que shuffle déversement (disque) est la taille de la forme sérialisée des données sur le disque après nous renverser. C'est pourquoi cette dernière a tendance à être beaucoup plus petit que l'ancien. Notez que les deux mesures sont agrégées sur l'ensemble de la durée de la tâche (c'est à dire à l'intérieur de chaque tâche, vous pouvez déversement plusieurs fois).
OriginalL'auteur user3886907
La
persist
appels dans votre code sont entièrement perdues si vous n'avez pas accès à la RDD plusieurs fois. Quel est le point de ranger quelque chose si vous n'avez jamais y avoir accès? La mise en cache n'a aucune incidence sur shuffle comportement d'autres que vous pouvez éviter de re-faire le mélange en gardant leur sortie en cache.Shuffle déversement est contrôlée par le
spark.shuffle.déversement
etspark.shuffle.memoryFraction
paramètres de configuration. Sispill
est activé (il l'est par défaut), puis lecture aléatoire de fichiers de déversement sur le disque si ils commencent à utiliser plus dememoryFraction
(20% par défaut).Les mesures sont très confus. Ma lecture de la code est que "Shuffle déversement (de mémoire)" est la quantité de mémoire qui a été libéré que les choses ont été déversés sur le disque. Le code pour "Shuffle déversement (disque)" dirait que c'est la quantité effectivement écrit sur le disque. Par la code pour "Shuffle écrire" je pense que c'est le montant inscrit sur le disque directement — non pas comme un déversement d'un trieur.
Je ne peux pas vérifier maintenant — peut-être que vous avez raison et
persist
avoir un effet sur combien de temps le shuffle sorties sont conservés. Je pense qu'ils sont conservés jusqu'à la RDD est nettoyée de toute façon. Pour réduire le shuffle, taille du fichier vous pouvez utiliser Kryo (avec enregistrement) et bien sûr essayer de rendre les données plus petits avant le shuffle, par exemple par filtration.OriginalL'auteur Daniel Darabos
shuffle de données
Shuffle écrire désigne les données qui ont écrit à votre système de fichiers local temporaire emplacement de la cache. De fil en mode cluster, vous pouvez définir cette propriété avec l'attribut "fil.nodemanager.local-dirs" yarn-site.xml. À cet effet, le "shuffle écrire" signifie que la taille des données que vous avez écrit à l'emplacement temporaire; "Shuffle noire" est plus probable que votre shuffle résultat de l'étape. De toute façon, ceux de la figure sont accumulés.
OriginalL'auteur jianfeng gong
Une note plus sur la façon de prévenir shuffle déversement, car je pense que c'est la partie la plus importante de la question à partir d'une dimension de la performance (lecture aléatoire d'écrire, comme mentionné ci-dessus, est une partie nécessaire de brassage).
Déversement se produit lorsque la lecture aléatoire lecture, tout le réducteur ne peut pas l'adapter à tous les dossiers qui lui sont assignées en mémoire dans la lecture aléatoire de l'espace sur que l'exécuteur testamentaire. Si votre shuffle est asymétrique (par exemple, le débit de certaines partitions sont beaucoup plus grandes que certaines d'entrée partitions), vous pouvez avoir shuffle déversement, même si les partitions "tenir en mémoire" avant de les mélanger. Le meilleur moyen de contrôler ce qui est par
A) l'équilibrage de l'aléatoire... e.g changement de votre code afin de réduire avant le battage ou par traînant sur les différentes touches
ou
B) la modification de la lecture aléatoire des paramètres de la mémoire comme suggéré ci-dessus
Compte tenu de l'ampleur du déversement sur le disque, vous aurez probablement besoin de faire Un plutôt que de B.
OriginalL'auteur chelBert