Yanıtlar:
İle cache()yalnızca varsayılan depolama düzeyini kullanırsınız:
MEMORY_ONLYiçin RDDMEMORY_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 levelcache() Yöntemi varsayılan depolama seviyesinin kullanılması için bir kısaltmadırStorageLevel.MEMORY_ONLY(mağaza bellekteki nesneleri serileştirilemeyen).
persist()Şunlardan farklı bir depolama düzeyi atamak istiyorsanız kullanın :
MEMORY_ONLYiçin RDDMEMORY_AND_DISKiçin VerisetininResmi belgeler için ilginç bir bağlantı: hangi depolama düzeyini seçeceğiniz
MEMORY_AND_DISKyalnızca Veri Kümeleri için varsayılan değerdir. MEMORY_ONLYhala RDD için varsayılan değerdir
cacheVepersistişlemler arasındaki fark tamamen sözdizimseldir. önbellek, persist veya persist (MEMORY_ONLY) kelimesinin eşanlamlısıdır , yanicacheyalnızcapersistvarsayı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,cacheBu 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 varyantpersist() vecache() parametresi yalnızca kısaltmalardırpersist(StorageLevel.MEMORY_ONLY).Uyarı : Depolama seviyesi değiştirildikten sonra tekrar değiştirilemez!
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)
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ı:
Önbellekleme, uygulamanızın performansını büyük ölçüde artırabilir.
Spark 5 çeşit Depolama seviyesi sunar
MEMORY_ONLYMEMORY_ONLY_SERMEMORY_AND_DISKMEMORY_AND_DISK_SERDISK_ONLYcache()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.
Ö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).
cache()şimdi kullandığı MEMORY_AND_DISK