Niveaux de stockage de persistance Spark / Blogs / Perficient

Persistance des étincelles est un optimisation technologieniquequi enregistre les résultats de l’évaluation RDD. Spark fournit une méthode pratique pour travailler avec des ensembles de données en les stockant en mémoire au cours de diverses opérations. Lorsque vous conservez un ensemble de données, Spark stocke les données sur disque ou en mémoire, ou une combinaison des deux, afin qu’elles puissent être récupérées rapidement la prochaine fois que cela sera nécessaire. Cela réduit la surcharge de calcul.
Méthodes de niveaux de stockage de persistance
Nous pouvons persister RDD de deux manières. L’un est cache() et l’autre est persist(). La mise en cache ou la persistance de Spark DataFrame ou Dataset est une opération paresseuse, ce qui signifie qu’un DataFrame ne sera pas mis en cache jusqu’à ce que vous déclenchiez une action. Cette approche paresseuse de la mise en cache permet à Spark d’optimiser le plan d’exécution et d’éviter la mise en cache inutile de données intermédiaires qui ne pourraient pas être utilisées dans les calculs ultérieurs. Il aide à utiliser efficacement les ressources et à améliorer les performances globales.
Cache()
La méthode cache() l’enregistre par défaut dans MEMORY_AND_DISK
niveau de stockage alors que, comme avec la méthode persist(), nous pouvons conserver les données sur plusieurs niveaux de stockage.
Persister()
La méthode persist est utilisée pour conserver un RDD (Resilient Distributed Dataset) ou un DataFrame en mémoire afin qu’il puisse être réutilisé efficacement sur plusieurs opérations Spark. La méthode persist() peut être utilisée pour spécifier le niveau de stockage des données persistantes. Les niveaux de stockage disponibles incluent MEMORY_ONLY, MEMORY_ONLY_SER, MEMORY_AND_DISK, MEMORY_AND_DISK_SER, DISK_ONLY et OFF_HEAP. Les niveaux MEMORY_ONLY et MEMORY_ONLY_SER stockent les données en mémoire, tandis que les niveaux MEMORY_AND_DISK et MEMORY_AND_DISK_SER stockent les données en mémoire et sur disque. Le niveau DISK_ONLY stocke les données sur le disque uniquement, tandis que le niveau OFF_HEAP stocke les données dans la mémoire hors tas.
Lorsque vous utilisez la méthode persist() sans spécifier de niveau de stockage, la valeur par défaut est le niveau de stockage MEMORY_ONLY.
Types de niveaux de stockage
- MEMORY_ONLY : Ce niveau de stockage stocke le RDD ou le DataFrame en tant qu’objets Java désérialisés dans le tas JVM. Cela permet un accès rapide aux données mais consomme plus de mémoire.
- MEMORY_ONLY_SER : C’est la même chose que MEMORY_ONLY mais la différence est qu’il stocke RDD sous forme d’objets sérialisés dans la mémoire JVM. Cela réduit l’utilisation de la mémoire mais nécessite une désérialisation lors de l’accès aux données.
- MEMORY_AND_DISK : Il stocke les partitions qui ne tiennent pas en mémoire sur le disque et conserve le reste en mémoire. Cela peut être utile lorsque vous travaillez avec des ensembles de données plus volumineux que la mémoire disponible.
- MEMORY_AND_DISK_SER : Similaire à MEMORY_AND_DISK, mais stocke les objets Java sérialisés sur le disque.
- DISK_ONLY : Les données sont stockées uniquement sur le disque et sont lues en mémoire à la demande lors de leur accès. Ce niveau de stockage est celui qui utilise le moins de mémoire mais peut entraîner des temps d’accès plus lents.
- OFF_HEAP : Les données sont stockées hors du tas JVM sous forme sérialisée. Cela peut être utile pour les grands ensembles de données qui ne rentrent pas dans le tas.
Ces exemples illustrent l’utilisation de différents niveaux de stockage avec la méthode persist dans Spark Scala, montrant comment mettre en cache les RDD en mémoire ou sur disque pour de meilleures performances lors des opérations Spark ultérieures. Ces niveaux de stockage offrent une flexibilité dans la gestion du compromis entre performances et utilisation de la mémoire en fonction de vos besoins spécifiques et des ressources disponibles. Choisissez le niveau de stockage en fonction de votre cas d’utilisation spécifique et des caractéristiques de vos données.
Quand utiliser quoi
- Utilisez MEMORY_ONLY ou MEMORY_ONLY_SER lorsque :
- Une mémoire suffisante est disponible.
- Une surcharge minimale du processeur est souhaitée.
- Pas besoin de déversement de données sur le disque.
- Utilisez MEMORY_AND_DISK ou MEMORY_AND_DISK_SER lorsque :
- La mémoire est limitée.
- Un équilibre entre l’utilisation de la mémoire et le temps CPU est requis.
- Certaines données peuvent être déversées sur le disque.
- L’ensemble de données est trop volumineux pour tenir en mémoire.
- Les E/S disque sont acceptables.
- Le recalcul est acceptable.
Quelle est la meilleure méthode
Il n’y a pas de réponse universelle ; la meilleure méthode dépend de votre cas d’utilisation spécifique.
- Si vous disposez de suffisamment de mémoire pour stocker l’intégralité de l’ensemble de données, MEMORY_ONLY est efficace.
- Si la mémoire est un problème, MEMORY_AND_DISK ou MEMORY_AND_DISK_SER fournissent un équilibre.
- Utilisez DISK_ONLY uniquement lorsque l’ensemble de données est extrêmement volumineux et ne peut pas tenir en mémoire.
- MEMORY_ONLY et MEMORY_ONLY_SER offrent les meilleures performances lorsque les données tiennent entièrement en mémoire.
- MEMORY_AND_DISK et MEMORY_AND_DISK_SER offrent un compromis entre l’utilisation de la mémoire et la vitesse de recalcul.
- DISK_ONLY convient aux très grands ensembles de données mais s’accompagne d’un temps de recalcul accru.
Ne plus persister RDD dans Spark
Lorsque vous conservez un ensemble de données dans Spark, il stocke les données dans le niveau de stockage spécifié jusqu’à ce que vous le supprimiez explicitement de la mémoire ou du disque. Vous pouvez supprimer un ensemble de données persistant à l’aide de la méthode unpersist().
Conclusion
L’utilisation de la mise en cache et de la persistance dans Spark constitue des mécanismes efficaces pour accélérer le traitement des données. En mettant en cache ou en conservant un ensemble de données, vous pouvez conserver les données en mémoire ou sur disque afin de pouvoir les récupérer rapidement la prochaine fois que vous en aurez besoin. Ces méthodes s’avèrent particulièrement avantageuses lorsqu’il s’agit d’opérations répétitives sur le même ensemble de données. Cependant, il est conseillé d’être prudent pendant le processus de mise en cache ou de persistance, car cela peut entraîner une consommation considérable de mémoire ou d’espace disque. La priorisation stratégique des ensembles de données pour la mise en cache ou la persistance est cruciale, et elle doit être basée sur leur importance dans votre flux de travail de traitement.
Source link