В чем разница между кешем и персистом?

Ответы:

222

При cache()использовании вы используете только уровень хранения по умолчанию:

  • MEMORY_ONLYдля СДР
  • MEMORY_AND_DISKдля набора данных

С помощью persist()вы можете указать, какой уровень хранилища вы хотите использовать как для RDD, так и для набора данных .

Из официальных документов:

  • Вы можете пометить RDDдля сохранения, используя методы persist() или cache() на нем.
  • каждый сохраненный RDDможет быть сохранен с использованием другогоstorage level
  • Метод cache() является сокращением для использования уровня хранилища по умолчанию, а именно StorageLevel.MEMORY_ONLY(хранение десериализованных объектов в памяти).

Используйте, persist()если вы хотите назначить уровень хранения, отличный от:

  • MEMORY_ONLYв СДР
  • или MEMORY_AND_DISKдля набора данных

Интересная ссылка на официальную документацию: какой уровень хранения выбрать

ahars
источник
17
Обратите внимание, что cache()теперь используется MEMORY_AND_DISK
ximiki
Я не думаю, что приведенный выше комментарий является правильным. Чтение последней официальной документации с использованием ссылки, которую ahars обеспечивает выравнивание с последней точкой маркера ... Метод cache () является сокращением для использования уровня хранилища по умолчанию, а именно StorageLevel.MEMORY_ONLY (хранить десериализованные объекты в памяти).
user2596560
1
@ximiki, MEMORY_AND_DISKэто значение по умолчанию только для наборов данных. MEMORY_ONLYпо-прежнему значение по умолчанию для СДР
ахарс
1
@ user2596560 комментарий правильный для значения кэша по умолчанию для наборов данных. Вы правы для СДР, которые все еще сохраняют значение по умолчанию
MEMORY_ONLY
83

Разница между cacheи persistоперации чисто синтаксический. кеш - это синоним persist или persist ( MEMORY_ONLY), то cacheесть просто persistс уровнем хранения по умолчаниюMEMORY_ONLY


/ ** * Сохранить этот RDD с уровнем хранения по умолчанию ( MEMORY_ONLY). * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)

/ ** * Сохранить этот RDD с уровнем хранения по умолчанию ( MEMORY_ONLY). * /
def cache (): this.type = persist ()

подробности смотрите здесь ...


Кэширование или сохранение являются методами оптимизации (итеративных и интерактивных) вычислений Spark. Они помогают сохранить промежуточные частичные результаты, чтобы их можно было использовать на последующих этапах. RDDТаким образом, эти промежуточные результаты сохраняются в памяти (по умолчанию) или в более надежном хранилище, таком как диск, и / или тиражируются. RDDs можно кэшировать с помощью cacheоперации. Они также могут быть сохранены с помощью persistоперации.

persist, cache

Эти функции могут быть использованы для настройки уровня хранения RDD. При освобождении памяти Spark будет использовать идентификатор уровня хранения, чтобы решить, какие разделы следует сохранить. Параметр без вариантов persist() и cache() являются просто сокращениями для persist(StorageLevel.MEMORY_ONLY).

Предупреждение : после изменения уровня хранения его нельзя изменить снова!

Предупреждение - Кэшируйте разумно ... смотрите ( (Почему) нам нужно вызывать кеш или сохранять на RDD )

То, что вы можете кэшировать данные RDDв памяти, не означает, что вы должны делать это вслепую. В зависимости от количества обращений к набору данных и объема работы, выполняемой при этом, пересчет может быть быстрее, чем цена, заплаченная из-за повышенного давления памяти.

Само собой разумеется, что если вы читаете набор данных только один раз, когда нет смысла его кэшировать, это фактически замедлит вашу работу. Размер кэшированных наборов данных можно увидеть из Spark Shell.

Листинг Варианты ...

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

* См. Пример ниже: *

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)

введите изображение здесь

Примечание. Из-за очень небольшой и чисто синтаксической разницы между кэшированием и постоянством RDDs эти два термина часто используются взаимозаменяемо.

Смотрите больше визуально здесь ....

Сохраняться в памяти и на диске:

введите описание изображения здесь

кэш

Кэширование может значительно повысить производительность вашего приложения.

введите описание изображения здесь

Рам Гадиярам
источник
У меня есть DF внутри блока. Как я могу получить к нему доступ.
Биндумалини К.К.
48

Нет никакой разницы. От 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()
Майк Парк
источник
23

Spark дает 5 типов уровня хранения

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()будем использовать MEMORY_ONLY. Если вы хотите использовать что-то еще, используйте persist(StorageLevel.<*type*>).

По умолчанию данные persist()будут храниться в куче JVM как несериализованные объекты.

ketankk
источник
4

Cache () и persist () оба метода используются для повышения производительности вычислений с использованием искры. Эти методы помогают сохранить промежуточные результаты, чтобы их можно было повторно использовать на последующих этапах.

Единственная разница между cache () и persist () заключается в том, что используя технику Cache, мы можем сохранять промежуточные результаты в памяти только при необходимости, а в Persist () мы можем сохранять промежуточные результаты на 5 уровнях хранения (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

user11332824
источник