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