Yanıtlar:
İle cache()
yalnızca varsayılan depolama düzeyini kullanırsınız:
MEMORY_ONLY
için RDDMEMORY_AND_DISK
iç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
RDD
kullanarak kalıcı olacak bir işareti işaretleyebilirsiniz .persist
cache
- kalıcı olan her biri
RDD
farklı birstorage level
cache
() 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_ONLY
için RDDMEMORY_AND_DISK
için VerisetininResmi belgeler için ilginç bir bağlantı: hangi depolama düzeyini seçeceğiniz
MEMORY_AND_DISK
yalnızca Veri Kümeleri için varsayılan değerdir. MEMORY_ONLY
hala RDD için varsayılan değerdir
cache
Vepersist
işlemler arasındaki fark tamamen sözdizimseldir. önbellek, persist veya persist (MEMORY_ONLY
) kelimesinin eşanlamlısıdır , yanicache
yalnızcapersist
varsayı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 RDD
bu nedenle bellekte (varsayılan) veya disk gibi daha fazla katı depolamada saklanır ve / veya çoğaltılır.
RDD
s cache
işlemi kullanılarak önbelleğe alınabilir . persist
Operasyon 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 varyantpersist
() vecache
() parametresi yalnızca kısaltmalardırpersist(StorageLevel.MEMORY_ONLY).
Uyarı : Depolama seviyesi değiştirildikten sonra tekrar değiştirilemez!
Bir RDD
bellekte ö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_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.
Ö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