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