Что касается RDD
настойчивости, каковы различия между cache()
и persist()
в искре?
В чем разница между кешированием и сохранением?
Ответы (6)
С cache()
вы используете только уровень хранения по умолчанию:
MEMORY_ONLY
для RDDMEMORY_AND_DISK
для набора данных
С помощью persist()
вы можете указать, какой уровень хранения вам нужен как для RDD, так и для набора данных.
Из официальных документов:
- Вы можете пометить
RDD
для сохранения с помощью методовpersist
() илиcache
() на нем.- каждый постоянный
RDD
может быть сохранен с использованием другогоstorage level
- Метод
cache
() - это сокращение для использования уровня хранения по умолчанию, который равенStorageLevel.MEMORY_ONLY
(хранить десериализованные объекты в памяти).
Используйте persist()
, если вы хотите назначить уровень хранения, отличный от:
MEMORY_ONLY
в СДР- или
MEMORY_AND_DISK
для набора данных
Интересная ссылка на официальную документацию: какой уровень хранения выбрать
MEMORY_AND_DISK
- значение по умолчанию только для наборов данных. MEMORY_ONLY
по-прежнему является значением по умолчанию для RDD
- person ahars; 28.10.2019
Разница между операциями
cache
иpersist
чисто синтаксическая. cache является синонимом persist или persist (MEMORY_ONLY
), т.е.cache
- это простоpersist
с уровнем хранения по умолчаниюMEMORY_ONLY
Но
Persist()
Мы можем сохранить промежуточные результаты на 5 уровнях хранения.
- MEMORY_ONLY
- MEMORY_AND_DISK
- MEMORY_ONLY_SER
- MEMORY_AND_DISK_SER
- DISK_ONLY
/ ** * Сохранить этот RDD с уровнем хранения по умолчанию (
MEMORY_ONLY
). * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)/ ** * Сохранить этот RDD с уровнем хранения по умолчанию (
MEMORY_ONLY
). * /
def cache (): this.type = persist ()
подробнее здесь ...
Кэширование или постоянство - это методы оптимизации (итеративных и интерактивных) вычислений Spark. Они помогают сохранить промежуточные частичные результаты, чтобы их можно было повторно использовать на последующих этапах. Таким образом, эти промежуточные результаты в виде RDD
s хранятся в памяти (по умолчанию) или в более твердом хранилище, таком как диск и / или реплицируются. RDD
s можно кэшировать с помощью операции 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)
Примечание: из-за очень небольшой и чисто синтаксической разницы между кешированием и сохранением RDD
s эти два термина часто используются как взаимозаменяемые.
Посмотреть больше наглядно здесь ....
Сохраняться в памяти и на диске:
Кэш
Кэширование может в значительной степени улучшить производительность вашего приложения.
Нет никакой разницы. От 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()
Spark дает 5 типов уровня хранения
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
будет использовать MEMORY_ONLY
. Если вы хотите использовать что-то еще, используйте persist(StorageLevel.<*type*>)
.
По умолчанию persist()
будет хранить данные в куче JVM как несериализованные объекты.
Оба метода Cache () и persist () используются для повышения производительности искровых вычислений. Эти методы помогают сохранить промежуточные результаты, чтобы их можно было повторно использовать на последующих этапах.
Единственная разница между cache () и persist () заключается в том, что с помощью метода Cache мы можем сохранять промежуточные результаты в памяти только при необходимости, в то время как в Persist () мы можем сохранять промежуточные результаты на 5 уровнях хранения (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).
нетерпеливым:
Тем же
Без передачи аргумента 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 )
Вуаля!