Відповіді:
З cache()
, ви використовуєте лише рівень зберігання за замовчуванням:
MEMORY_ONLY
для RDDMEMORY_AND_DISK
для набору данихЗ persist()
, ви можете вказати, який рівень пам’яті ви хочете як для RDD, так і для набору даних .
З офіційних документів:
- Ви можете відзначити
RDD
збереження, використовуючи методиpersist
() абоcache
().- кожен збережений
RDD
може зберігатися, використовуючи різніstorage level
- Метод
cache
() - це скорочення для використання рівня зберігання за замовчуванням, який єStorageLevel.MEMORY_ONLY
(зберігання десеріалізованих об'єктів у пам'яті).
Використовуйте, persist()
якщо ви хочете призначити рівень пам’яті, окрім:
MEMORY_ONLY
до RDDMEMORY_AND_DISK
для набору данихЦікаве посилання для офіційної документації: який рівень зберігання вибрати
MEMORY_AND_DISK
- це значення за замовчуванням лише для наборів даних. MEMORY_ONLY
як і раніше значення за замовчуванням для RDD
Різниця між
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 ()
дивіться детальніше тут ...
Кешування або наполегливість - це методи оптимізації для (ітеративних та інтерактивних) іскрових обчислень. Вони допомагають зберегти проміжні часткові результати, щоб їх можна було повторно використовувати на наступних етапах. Ці проміжні результати як RDD
s зберігаються в пам'яті (за замовчуванням) або на більш твердому сховищі, як диск та / або реплікуються.
RDD
s можна кешувати за допомогою cache
операції. Вони також можуть зберігатися за допомогою persist
операції.
persist
,cache
Ці функції можна використовувати для регулювання рівня зберігання a
RDD
. Під час звільнення пам'яті Spark використовує ідентифікатор рівня пам’яті, щоб визначити, які розділи потрібно зберігати. Параметри, менші варіантівpersist
() таcache
(), є лише абревіатурами дляpersist(StorageLevel.MEMORY_ONLY).
Попередження : Після зміни рівня зберігання він не може бути змінений знову!
Тільки тому, що ви можете кешувати RDD
пам'ять, не означає, що вам слід це робити сліпо. Залежно від того, скільки разів звертається до набору даних та обсягу роботи, що займається цим, перерахунок може бути швидшим, ніж ціна, сплачена підвищеним тиском пам'яті.
Само собою зрозуміло, що якщо ви читаєте набір даних лише раз, коли немає сенсу кешувати його, це фактично зробить вашу роботу повільніше. Розмір кешованих наборів даних видно з іскрової оболонки ..
Варіанти лістингу ...
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 два терміни часто використовуються взаємозамінно.
Дивіться більше візуально тут….
Залишаються в пам'яті та диску:
Кешування може значно покращити продуктивність вашої програми.
Іскра дає 5 типів рівня зберігання
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
буде використовувати MEMORY_ONLY
. Якщо ви хочете використовувати щось інше, використовуйте persist(StorageLevel.<*type*>)
.
За замовчуванням persist()
дані зберігатимуться в купі JVM як несеріалізовані об'єкти.
Кеш () та persist () обидва методи використовуються для підвищення продуктивності обчислення іскри. Ці методи допомагають зберегти проміжні результати, щоб їх можна було повторно використовувати на наступних етапах.
Єдина відмінність кеша () від persist () полягає в тому, що за допомогою кеш-техніки ми можемо зберігати проміжні результати в пам'яті лише тоді, коли це потрібно, тоді як в Persist () ми можемо зберегти проміжні результати на 5 рівнях зберігання (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).
cache()
зараз використовується MEMORY_AND_DISK