Яка різниця між кешем та персистенцією?


Відповіді:


222

З cache(), ви використовуєте лише рівень зберігання за замовчуванням:

  • MEMORY_ONLYдля RDD
  • MEMORY_AND_DISKдля набору даних

З persist(), ви можете вказати, який рівень пам’яті ви хочете як для RDD, так і для набору даних .

З офіційних документів:

  • Ви можете відзначити RDDзбереження, використовуючи методи persist() або cache().
  • кожен збережений RDDможе зберігатися, використовуючи різніstorage level
  • Метод cache() - це скорочення для використання рівня зберігання за замовчуванням, який є StorageLevel.MEMORY_ONLY(зберігання десеріалізованих об'єктів у пам'яті).

Використовуйте, persist()якщо ви хочете призначити рівень пам’яті, окрім:

  • MEMORY_ONLYдо RDD
  • або MEMORY_AND_DISKдля набору даних

Цікаве посилання для офіційної документації: який рівень зберігання вибрати


17
Зауважте, що cache()зараз використовується MEMORY_AND_DISK
ximiki

Я не вважаю, що наведений вище коментар є правильним. Читаючи останню офіційну документацію, використовуючи ahars посилання, забезпечується вирівнювання з останньою точкою кулі ... Метод кеша () - це скорочення для використання рівня зберігання за замовчуванням, який є StorageLevel.MEMORY_ONLY (зберігання десеріалізованих об'єктів у пам'яті).
користувач2596560

1
@ximiki MEMORY_AND_DISK- це значення за замовчуванням лише для наборів даних. MEMORY_ONLYяк і раніше значення за замовчуванням для RDD
ahars

1
@ user2596560 коментар правильний для значення кешу за замовчуванням наборів даних. Ви маєте право на RDD, який досі зберігає значення MEMORY_ONLY за замовчуванням
ahars

83

Різниця між 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 ()

дивіться детальніше тут ...


Кешування або наполегливість - це методи оптимізації для (ітеративних та інтерактивних) іскрових обчислень. Вони допомагають зберегти проміжні часткові результати, щоб їх можна було повторно використовувати на наступних етапах. Ці проміжні результати як RDDs зберігаються в пам'яті (за замовчуванням) або на більш твердому сховищі, як диск та / або реплікуються. RDDs можна кешувати за допомогою cacheоперації. Вони також можуть зберігатися за допомогою persistоперації.

persist, cache

Ці функції можна використовувати для регулювання рівня зберігання a RDD. Під час звільнення пам'яті Spark використовує ідентифікатор рівня пам’яті, щоб визначити, які розділи потрібно зберігати. Параметри, менші варіантів persist() та cache(), є лише абревіатурами для persist(StorageLevel.MEMORY_ONLY).

Попередження : Після зміни рівня зберігання він не може бути змінений знову!

Попередження - Кешуйте розумно ... дивіться ( (чому) нам потрібно викликати кеш або зберігати RDD )

Тільки тому, що ви можете кешувати 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)

введіть зображення тут

Примітка: Через дуже малу і чисто синтаксичну різницю між кешуванням та стійкістю RDDs два терміни часто використовуються взаємозамінно.

Дивіться більше візуально тут….

Залишаються в пам'яті та диску:

введіть тут опис зображення

Кеш

Кешування може значно покращити продуктивність вашої програми.

введіть тут опис зображення


У мене є блок DF всередині блоку. Як я можу отримати доступ до нього.
Bindumalini KK

48

Різниці немає. З 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()

23

Іскра дає 5 типів рівня зберігання

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()буде використовувати MEMORY_ONLY. Якщо ви хочете використовувати щось інше, використовуйте persist(StorageLevel.<*type*>).

За замовчуванням persist()дані зберігатимуться в купі JVM як несеріалізовані об'єкти.


4

Кеш () та persist () обидва методи використовуються для підвищення продуктивності обчислення іскри. Ці методи допомагають зберегти проміжні результати, щоб їх можна було повторно використовувати на наступних етапах.

Єдина відмінність кеша () від persist () полягає в тому, що за допомогою кеш-техніки ми можемо зберігати проміжні результати в пам'яті лише тоді, коли це потрібно, тоді як в Persist () ми можемо зберегти проміжні результати на 5 рівнях зберігання (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.