Ответы:
При cache()
использовании вы используете только уровень хранения по умолчанию:
MEMORY_ONLY
для СДРMEMORY_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
по-прежнему значение по умолчанию для СДР
Разница между
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
Таким образом, эти промежуточные результаты сохраняются в памяти (по умолчанию) или в более надежном хранилище, таком как диск, и / или тиражируются.
RDD
s можно кэшировать с помощью cache
операции. Они также могут быть сохранены с помощью persist
операции.
persist
,cache
Эти функции могут быть использованы для настройки уровня хранения
RDD
. При освобождении памяти Spark будет использовать идентификатор уровня хранения, чтобы решить, какие разделы следует сохранить. Параметр без вариантовpersist
() иcache
() являются просто сокращениями дляpersist(StorageLevel.MEMORY_ONLY).
Предупреждение : после изменения уровня хранения его нельзя изменить снова!
То, что вы можете кэшировать данные 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 эти два термина часто используются взаимозаменяемо.
Смотрите больше визуально здесь ....
Сохраняться в памяти и на диске:
Кэширование может значительно повысить производительность вашего приложения.
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).
cache()
теперь используется MEMORY_AND_DISK