Cache ve persist arasındaki fark nedir?


Yanıtlar:


222

İle cache()yalnızca varsayılan depolama düzeyini kullanırsınız:

  • MEMORY_ONLYiçin RDD
  • MEMORY_AND_DISKiçin Verisetinin

İle persist(), size her ikisi için istediğiniz depolama seviyesi belirtebilirsiniz RDD ve DataSetbırakma .

Resmi dokümanlardan:

  • Üzerinde () veya () yöntemlerini RDDkullanarak kalıcı olacak bir işareti işaretleyebilirsiniz .persistcache
  • kalıcı olan her biri RDDfarklı birstorage level
  • cache() Yöntemi varsayılan depolama seviyesinin kullanılması için bir kısaltmadır StorageLevel.MEMORY_ONLY(mağaza bellekteki nesneleri serileştirilemeyen).

persist()Şunlardan farklı bir depolama düzeyi atamak istiyorsanız kullanın :

  • MEMORY_ONLYiçin RDD
  • ya MEMORY_AND_DISKiçin Verisetinin

Resmi belgeler için ilginç bir bağlantı: hangi depolama düzeyini seçeceğiniz


17
Not cache()şimdi kullandığı MEMORY_AND_DISK
ximiki

Yukarıdaki yorumun doğru olduğunu düşünmüyorum. Ahars bağlantısını kullanarak en son resmi belgeleri okumak, son madde işareti noktasına hizalar ... cache () yöntemi, StorageLevel.MEMORY_ONLY (deserialized nesneleri bellekte saklamak) olan varsayılan depolama düzeyini kullanmak için bir kısayoldur.
user2596560

1
@ximiki, MEMORY_AND_DISKyalnızca Veri Kümeleri için varsayılan değerdir. MEMORY_ONLYhala RDD için varsayılan değerdir
ahars

1
@ user2596560 yorum, veri kümelerinin varsayılan önbellek değeri için doğrudur. Hala MEMORY_ONLY varsayılan değerini koruyan RDD için haklısınız
ahars

83

cacheVe persistişlemler arasındaki fark tamamen sözdizimseldir. önbellek, persist veya persist ( MEMORY_ONLY) kelimesinin eşanlamlısıdır , yani cacheyalnızca persistvarsayılan depolama düzeyidirMEMORY_ONLY


/ ** * Bu RDD'ye varsayılan depolama düzeyiyle ( MEMORY_ONLY) devam edin. * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)

/ ** * Bu RDD'ye varsayılan depolama düzeyiyle ( MEMORY_ONLY) devam edin. * /
def cache (): this.type = persist ()

daha fazla ayrıntıya buradan bakın ...


Önbellekleme veya kalıcılık (yinelemeli ve etkileşimli) Spark hesaplamaları için optimizasyon teknikleridir. Geçici kısmi sonuçların kaydedilmesine yardımcı olurlar, böylece sonraki aşamalarda tekrar kullanılabilirler. Bu ara sonuçlar RDDbu nedenle bellekte (varsayılan) veya disk gibi daha fazla katı depolamada saklanır ve / veya çoğaltılır. RDDs cacheişlemi kullanılarak önbelleğe alınabilir . persistOperasyon kullanılarak da kalıcı olabilirler .

persist, cache

Bu işlevler a'nın depolama düzeyini ayarlamak için kullanılabilir RDD. Belleği boşaltırken Spark, hangi bölümlerin saklanması gerektiğine karar vermek için depolama düzeyi tanımlayıcısını kullanır. Daha az varyant persist() ve cache() parametresi yalnızca kısaltmalardır persist(StorageLevel.MEMORY_ONLY).

Uyarı : Depolama seviyesi değiştirildikten sonra tekrar değiştirilemez!

Uyarı -Akıllı bir şekilde önbellekleyin ... bkz. ( (Neden) önbelleği çağırmamız veya RDD'de kalmamız gerekiyor mu )

Bir RDDbellekte önbellekleme yapabilmeniz, bunu körü körüne yapmanız gerektiği anlamına gelmez. Veri kümesine kaç kez erişildiğine ve bunu yapmak için gereken iş miktarına bağlı olarak, yeniden hesaplama artan bellek baskısı tarafından ödenen fiyattan daha hızlı olabilir.

Bir veri kümesini yalnızca önbelleğe almanın bir anlamı olmadığında okursanız, işinizi yavaşlatacağını söylemeye gerek yoktur. Önbelleğe alınmış veri kümelerinin boyutu Spark Shell'den görülebilir.

Listeleme Varyantları ...

def cache(): RDD[T]
 def persist(): RDD[T]
 def persist(newLevel: StorageLevel): RDD[T]

* Aşağıdaki örneğe bakın: *

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)

buraya resim gir

Not: Önbellekleme ve kalıcılığı arasındaki çok küçük ve tamamen sözdizimsel fark nedeniyle RDD, iki terim genellikle birbirinin yerine kullanılır.

Daha görsel olarak burada görün ....

Bellek ve diskte kalıcı:

resim açıklamasını buraya girin

Önbellek

Önbellekleme, uygulamanızın performansını büyük ölçüde artırabilir.

resim açıklamasını buraya girin


Bir bloğun içinde bir DF var.Ona nasıl erişebilirim.
Bindumalini KK

48

Fark yok. Gönderen 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

Spark 5 çeşit Depolama seviyesi sunar

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()kullanır MEMORY_ONLY. Başka bir şey kullanmak istiyorsanız, kullanın persist(StorageLevel.<*type*>).

Varsayılan olarak persist(), verileri JVM yığınında serileştirilmemiş nesneler olarak saklar.


4

Önbellek () ve persist () yöntemlerinin her ikisi de kıvılcım hesaplamasının performansını artırmak için kullanılır. Bu yöntemler ara sonuçların kaydedilmesine yardımcı olur, böylece sonraki aşamalarda tekrar kullanılabilirler.

Cache () ve persist () arasındaki tek fark, Önbellek tekniğini kullanarak ara sonuçları yalnızca gerektiğinde Persist () içinde kaydedebildiğimizde ara sonuçları 5 depolama düzeyinde (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.