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

Что касается RDD настойчивости, каковы различия между cache() и persist() в искре?


person Ramana    schedule 11.11.2014    source источник


Ответы (6)


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

  • MEMORY_ONLY для RDD
  • MEMORY_AND_DISK для набора данных

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

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

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

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

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

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

person ahars    schedule 12.11.2014
comment
Обратите внимание, что cache() теперь использует MEMORY_AND_DISK - person ximiki; 22.06.2018
comment
Я не думаю, что приведенный выше комментарий верен. Чтение последней официальной документации, использование ссылки, которую предоставляет ahars, соответствует последнему пункту маркера ... Метод cache () является сокращением для использования уровня хранения по умолчанию, которым является StorageLevel.MEMORY_ONLY (хранить десериализованные объекты в памяти). - person user2596560; 18.09.2019
comment
@ximiki, MEMORY_AND_DISK - значение по умолчанию только для наборов данных. MEMORY_ONLY по-прежнему является значением по умолчанию для RDD - person ahars; 28.10.2019
comment
@ user2596560 комментарий верен для значения кеша по умолчанию для наборов данных. Вы правы для RDD, который по-прежнему сохраняет значение по умолчанию MEMORY_ONLY - person ahars; 28.10.2019

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

Но Persist() Мы можем сохранить промежуточные результаты на 5 уровнях хранения.

  1. MEMORY_ONLY
  2. MEMORY_AND_DISK
  3. MEMORY_ONLY_SER
  4. MEMORY_AND_DISK_SER
  5. DISK_ONLY

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

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

подробнее здесь ...


Кэширование или постоянство - это методы оптимизации (итеративных и интерактивных) вычислений Spark. Они помогают сохранить промежуточные частичные результаты, чтобы их можно было повторно использовать на последующих этапах. Таким образом, эти промежуточные результаты в виде RDDs хранятся в памяти (по умолчанию) или в более твердом хранилище, таком как диск и / или реплицируются. 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 эти два термина часто используются как взаимозаменяемые.

Посмотреть больше наглядно здесь ....

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

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

Кэш

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

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

person Ram Ghadiyaram    schedule 09.08.2016
comment
У меня есть DF внутри блока, как я могу получить к нему доступ. - person Bindumalini KK; 25.10.2016

Нет никакой разницы. От 1_.

/** 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()
person Mike Park    schedule 11.11.2014

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

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

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

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

person ketankk    schedule 05.04.2017

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

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

person user11332824    schedule 09.04.2019

нетерпеливым:

Тем же

Без передачи аргумента persist() и cache() одинаковы, с настройками по умолчанию:

  • когда RDD: MEMORY_ONLY
  • когда Dataset: MEMORY_AND_DISK

Разница:

В отличие от cache(), persist() позволяет передавать аргумент внутри скобок, чтобы указать уровень:

  • persist(MEMORY_ONLY)
  • persist(MEMORY_ONLY_SER)
  • persist(MEMORY_AND_DISK)
  • persist(MEMORY_AND_DISK_SER )
  • persist(DISK_ONLY )

Вуаля!

person jack    schedule 04.11.2020