Відповіді:
З 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 ()
дивіться детальніше тут ...
Кешування або наполегливість - це методи оптимізації для (ітеративних та інтерактивних) іскрових обчислень. Вони допомагають зберегти проміжні часткові результати, щоб їх можна було повторно використовувати на наступних етапах. Ці проміжні результати як RDDs зберігаються в пам'яті (за замовчуванням) або на більш твердому сховищі, як диск та / або реплікуються.
RDDs можна кешувати за допомогою 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)
Примітка: Через дуже малу і чисто синтаксичну різницю між кешуванням та стійкістю RDDs два терміни часто використовуються взаємозамінно.
Дивіться більше візуально тут….
Залишаються в пам'яті та диску:
Кешування може значно покращити продуктивність вашої програми.
Іскра дає 5 типів рівня зберігання
MEMORY_ONLYMEMORY_ONLY_SERMEMORY_AND_DISKMEMORY_AND_DISK_SERDISK_ONLYcache()буде використовувати 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