Selon Learning Spark
Gardez à l'esprit que la répartition de vos données est une opération assez coûteuse. Spark a également une version optimisée de
repartition()
appeléecoalesce()
qui permet d'éviter le mouvement des données, mais uniquement si vous diminuez le nombre de partitions RDD.
Une différence que j'obtiens est qu'avec repartition()
le nombre de partitions peut être augmenté / diminué, mais avec coalesce()
le nombre de partitions peut seulement être diminué.
Si les partitions sont réparties sur plusieurs machines et coalesce()
exécutées, comment éviter le mouvement des données?
la source
minimize data movement
au lieu deavoiding data movement
.repartition
devrait être utilisé à la place decoalesce
?repartition
est appelécoalesce
avec leshuffle
paramètre défini sur true. Faites-moi savoir si cela vous a été utile.shuffle = true
drapeauLa réponse de Justin est impressionnante et cette réponse va plus en profondeur.
L'
repartition
algorithme effectue un shuffle complet et crée de nouvelles partitions avec des données réparties uniformément. Créons un DataFrame avec les nombres de 1 à 12.numbersDf
contient 4 partitions sur ma machine.Voici comment les données sont réparties sur les partitions:
Faisons un shuffle complet avec la
repartition
méthode et obtenons ces données sur deux nœuds.Voici comment les
numbersDfR
données sont partitionnées sur ma machine:La
repartition
méthode crée de nouvelles partitions et distribue uniformément les données dans les nouvelles partitions (la distribution des données est plus uniforme pour les ensembles de données plus volumineux).Différence entre
coalesce
etrepartition
coalesce
utilise les partitions existantes pour minimiser la quantité de données mélangées.repartition
crée de nouvelles partitions et fait un shuffle complet.coalesce
entraîne des partitions avec différentes quantités de données (parfois des partitions de tailles très différentes) etrepartition
des partitions de taille à peu près égale.Est
coalesce
ourepartition
plus rapide?coalesce
peut s'exécuter plus rapidement querepartition
, mais les partitions de taille inégale sont généralement plus lentes à travailler que les partitions de taille égale. Vous devrez généralement répartir les ensembles de données après avoir filtré un grand ensemble de données. J'ai trouvérepartition
plus rapide dans l'ensemble parce que Spark est conçu pour fonctionner avec des partitions de taille égale.NB J'ai curieusement observé que la répartition peut augmenter la taille des données sur le disque . Assurez-vous d'exécuter des tests lorsque vous utilisez la répartition / fusion sur de grands ensembles de données.
Lisez cet article de blog si vous souhaitez encore plus de détails.
Quand vous utiliserez coalesce & repartition dans la pratique
la source
rdd.glom().map(len).collect()
mais cela donne beaucoup d'erreurs OOM.repartition
algorithme ne distribue pas les données de la même manière pour les très petits ensembles de données. J'avais l'habituderepartition
d'organiser 5 millions d'enregistrements en 13 partitions et chaque fichier mesurait entre 89,3 Mo et 89,6 Mo - c'est assez égal!Un point supplémentaire à noter ici est que, comme le principe de base de Spark RDD est l'immuabilité. La répartition ou la fusion créera un nouveau RDD. Le RDD de base continuera d'exister avec son nombre d'origine de partitions. Dans le cas où le cas d'utilisation demande de conserver le RDD dans le cache, la même chose doit être faite pour le RDD nouvellement créé.
la source
repartition
- il est recommandé de l'utiliser tout en augmentant le nombre de partitions, car cela implique de mélanger toutes les données.coalesce
- il est recommandé de l'utiliser tout en réduisant le nombre de partitions. Par exemple, si vous disposez de 3 partitions et que vous souhaitez la réduire à 2,coalesce
les données de la 3e partition seront déplacées vers les partitions 1 et 2. Les partitions 1 et 2 resteront dans le même conteneur. D'autre part,repartition
mélangera les données dans toutes les partitions, donc l'utilisation du réseau entre les exécuteurs sera élevée et cela aura un impact sur les performances.coalesce
fonctionne mieux querepartition
tout en réduisant le nombre de partitions.la source
Ce qui découle du code et des documents de code, c'est que
coalesce(n)
c'est la même chosecoalesce(n, shuffle = false)
etrepartition(n)
c'est la même chose quecoalesce(n, shuffle = true)
Ainsi, les deux
coalesce
etrepartition
peuvent être utilisés pour augmenter le nombre de partitionsUne autre note importante à souligner est que si vous diminuez considérablement le nombre de partitions, vous devriez envisager d'utiliser une version mélangée de
coalesce
(commerepartition
dans ce cas). Cela permettra à vos calculs d'être effectués en parallèle sur les partitions parentes (tâche multiple).Veuillez également vous référer à la réponse correspondante ici
la source
Toutes les réponses ajoutent une grande connaissance à cette question très souvent posée.
Donc, selon la tradition de la chronologie de cette question, voici mes 2 cents.
J'ai trouvé la répartition plus rapide que la fusion , dans des cas très spécifiques.
Dans mon application, lorsque le nombre de fichiers que nous estimons est inférieur au certain seuil, la répartition fonctionne plus rapidement.
Voici ce que je veux dire
Dans l'extrait ci-dessus, si mes fichiers étaient inférieurs à 20, la fusion prendrait une éternité pour se terminer tandis que la répartition était beaucoup plus rapide et donc le code ci-dessus.
Bien sûr, ce nombre (20) dépendra du nombre de travailleurs et de la quantité de données.
J'espère que cela pourra aider.
la source
Répartition : mélangez les données dans un NOUVEAU nombre de partitions.
Par exemple. La trame de données initiale est partitionnée en 200 partitions.
df.repartition(500)
: Les données seront transférées de 200 partitions à 500 nouvelles partitions.Coalesce : mélangez les données dans le nombre de partitions existant.
df.coalesce(5)
: Les données seront mélangées des 195 partitions restantes à 5 partitions existantes.la source
J'aimerais ajouter à la réponse de Justin et Power que -
repartition
ignorera les partitions existantes et en créera de nouvelles. Vous pouvez donc l'utiliser pour corriger le biais de données. Vous pouvez mentionner des clés de partition pour définir la distribution. L'asymétrie des données est l'un des plus gros problèmes dans l'espace des problèmes de «big data».coalesce
fonctionnera avec les partitions existantes et mélangera un sous-ensemble d'entre elles. Il ne peut pas corriger le biais de données autant que lerepartition
fait. Par conséquent, même s'il est moins cher, ce n'est peut-être pas la chose dont vous avez besoin.la source
À toutes les bonnes réponses, je voudrais ajouter que
repartition
c'est l'une des meilleures options pour tirer parti de la parallélisation des données. Bien quecoalesce
donne une option bon marché pour réduire les partitions et il est très utile lors de l'écriture de données sur HDFS ou un autre récepteur pour tirer parti des grandes écritures.J'ai trouvé cela utile lors de l'écriture de données au format parquet pour en tirer le meilleur parti.
la source
Pour quelqu'un qui a eu des problèmes pour générer un seul fichier csv à partir de PySpark (AWS EMR) en tant que sortie et l'enregistrer sur s3, l'utilisation de la répartition a aidé. La raison en est que la fusion ne peut pas faire un remaniement complet, mais la répartition peut. Essentiellement, vous pouvez augmenter ou diminuer le nombre de partitions en utilisant la répartition, mais vous ne pouvez diminuer le nombre de partitions (mais pas 1) en utilisant la fusion. Voici le code pour quiconque essaie d'écrire un csv depuis AWS EMR vers s3:
la source
D'une manière simple COALESCE: - est seulement pour diminue le nombre de partitions, pas de brassage des données, il suffit de compresser les partitions
RÉPARTITION: - est à la fois pour augmenter et diminuer le nombre de partitions, mais le brassage a lieu
Exemple:-
Les deux fonctionnent bien
Mais nous optons généralement pour ces deux choses lorsque nous devons voir la sortie dans un cluster, nous allons avec cela.
la source
Mais vous devez également vous assurer que les données qui arrivent, les nœuds de fusion doivent avoir une configuration élevée, si vous avez affaire à des données énormes. Parce que toutes les données seront chargées sur ces nœuds, peut entraîner une exception de mémoire. Bien que la réparation soit coûteuse, je préfère l'utiliser. Puisqu'il mélange et distribue les données également.
Soyez sage de choisir entre la fusion et la répartition.
la source
L'
repartition
algorithme effectue un brassage complet des données et crée des partitions de données de taille égale.coalesce
combine les partitions existantes pour éviter un shuffle complet.Coalesce fonctionne bien pour prendre un RDD avec beaucoup de partitions et combiner des partitions sur un seul nœud de travail pour produire un RDD final avec moins de partitions.
Repartition
va remanier les données dans votre RDD pour produire le nombre final de partitions que vous demandez. Le partitionnement des DataFrames semble être un détail d'implémentation de bas niveau qui devrait être géré par le framework, mais ce n'est pas le cas. Lorsque vous filtrez de gros DataFrames en plus petits, vous devez presque toujours repartitionner les données. Vous filtrerez probablement de gros DataFrames en plus petits fréquemment, alors habituez-vous au repartitionnement.Lisez cet article de blog si vous souhaitez encore plus de détails.
la source