Quelle est la différence entre cache et persist?

en termes de RDD persistance, quelles sont les différences entre cache() et persist() en spark ?

174
demandé sur Grzegorz Oledzki 2014-11-11 20:14:16

4 réponses

avec cache() , vous n'utilisez que le niveau de stockage par défaut MEMORY_ONLY . Avec persist() , vous pouvez spécifier le niveau de stockage que vous voulez,( rdd-persistance ).

D'après les documents officiels:

  • vous pouvez marquer un RDD à être persisté en utilisant les méthodes persist () ou cache () sur elle.
  • chacun persisté RDD peut être stocké en utilisant un autre storage level
  • la méthode cache () est un raccourci pour utiliser le niveau de stockage par défaut, qui est StorageLevel.MEMORY_ONLY (stocker des objets désérialisés en mémoire).

utilisez persist() si vous voulez attribuer un niveau de stockage autre que MEMORY_ONLY au RDD ( quel niveau de stockage choisir )

190
répondu ahars 2018-05-21 16:10:36

la mise en Cache ou la persévérance sont des techniques d'optimisation pour (itératif et interactif) Étincelle calculs. Ils permettent d'économiser les résultats partiels provisoires afin qu'ils puissent être réutilisés dans les étapes ultérieures. Ces résultats intermédiaires comme RDD s sont donc conservés en mémoire (par défaut) ou plus de stockage solide comme le disque et/ou répliqué. RDD s peut être mis en cache en utilisant l'opération cache . Ils peuvent également être maintenus en utilisant l'opération persist .

persist , cache

Ces fonctions peuvent être utilisées pour ajuster le niveau de stockage d'un RDD . Lors de la libération de la mémoire, Spark utilisera l'identifiant du niveau de stockage pour décider quelles cloisons doivent être conservées. Le paramètre moins les variantes persist () et cache () ne sont que des abréviations pour persist(StorageLevel.MEMORY_ONLY).

Avertissement : Une Fois le niveau de stockage a été modifié, il ne peut plus être modifié!

avertissement-Cache judicieusement... voir ( (Pourquoi) devons-nous appeler cache ou persister sur un RDD )

ce n'est pas parce que vous pouvez mettre en mémoire un RDD que vous devez le faire aveuglément. Selon combien de fois le jeu de données est accessible et la quantité de travail que cela comporte, recalcul peut être plus rapide que le prix payé par la pression de mémoire accrue.

il va sans dire que si vous ne lisez un ensemble de données qu'une fois qu'il n'y a aucun intérêt à le cacher, cela rendra votre travail plus lent. La taille des ensembles de données en cache peut être vue à partir de la coquille Spark..

Liste Des Variantes...

def cache(): RDD[T]
 def persist(): RDD[T]
 def persist(newLevel: StorageLevel): RDD[T]

* Voir exemple ci-dessous: *

val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
     c.getStorageLevel
     res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
     c.cache
     c.getStorageLevel
     res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)

enter image here

la différence entre les opérations cache et persist est purement syntaxique. cache est synonyme de persist ou persist ( MEMORY_ONLY ), i.e. cache est simplement persist avec le niveau de stockage par défaut MEMORY_ONLY

Note : En raison de la différence très faible et purement syntaxique entre la mise en cache et la persistance de RDD s les deux termes sont souvent utilisés de façon interchangeable.

voir plus visuellement ici....

Persistent dans la mémoire et le disque:

enter image description here

Cache

La mise en cache

peut améliorer les performances de votre application dans une large mesure. Source

enter image description here

66
répondu Ram Ghadiyaram 2017-05-23 11:47:21

Il n'y a pas de différence. De RDD.scala .

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()
42
répondu Mike Park 2014-11-11 19:13:04

Spark donne 5 types de niveau de stockage

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache() utilisera MEMORY_ONLY . Si vous voulez utiliser autre chose, utilisez persist(StorageLevel.<*type*>) .

par défaut persist() sera stocker les données dans le tas JVM comme la désérialisation des objets.

19
répondu Ketan Keshri 2017-05-27 11:40:22