RDD
の永続性に関しては、cache()
とpersist()
の違いは何ですか?
cache()
では、デフォルトのストレージレベルMEMORY_ONLY
のみを使用します。 persist()
を使うと、どの記憶域レベルを希望するかを指定できます( rdd-persistence )。
公式文書より:
RDD
()またはpersist
()メソッドを使用して、cache
を永続化するようにマークできます。- 永続化された各
RDD
は、異なるstorage level
を使用して格納できます。cache
()メソッドは、デフォルトの記憶レベルであるStorageLevel.MEMORY_ONLY
(逆シリアル化されたオブジェクトをメモリに格納する)を使用するための省略形です。
RDD
にMEMORY_ONLY
以外のストレージレベルを割り当てる場合はpersist()
を使用します( 選択するストレージレベル )
キャッシングまたは永続化は、(反復的および対話的な)Spark計算のための最適化手法です。それらは暫定的な部分的な結果を保存するのを助けますので、それらは後の段階で再利用することができます。 RDD
sとしてのこれらの暫定的な結果は、このようにメモリ(デフォルト)またはディスクのようなより強固なストレージに保持されたり、複製されたりします。 RDD
sはcache
操作を使用してキャッシュできます。 persist
操作を使って永続化することもできます。
persist
、cache
これらの関数は
RDD
の格納レベルを調整するために使うことができます。メモリを解放するとき、Sparkはどのパーティションを保持するべきかを決定するためにストレージレベル識別子を使います。パラメーターなしの変種persist
()およびcache
()は、persist(StorageLevel.MEMORY_ONLY).
の単なる省略形です。警告:一度ストレージレベルを変更すると、それを再び変更することはできません。
RDD
をメモリにキャッシュできるからといって、盲目的に行うべきではありません。データセットがアクセスされた回数とそれに伴う作業量によっては、再計算はメモリ負荷の増加によって支払われる価格よりも速い場合があります。
キャッシュしても意味がないデータセットを一度だけ読んでしまうと、実際には作業が遅くなることは言うまでもありません。キャッシュされたデータセットのサイズはSpark Shellから見ることができます。
バリアント一覧...
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)
cache
操作とpersist
操作の違いは、純粋に構文上のものです。 cacheはpersistまたはpersist(MEMORY_ONLY
)の同義語です。つまり、cache
は単にデフォルトのストレージレベルMEMORY_ONLY
を持つpersist
です。
注:RDD
sのキャッシングと永続化の間には非常に小さく純粋に構文上の違いがあるため、この2つの用語はしばしば同じ意味で使用されています。
ここでもっと視覚的に見てください....
メモリとディスクに固執する:
キャッシングは、アプリケーションのパフォーマンスを大幅に向上させることができます。
違いはありません。 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()
Sparkは5種類の収納レベルを提供
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
はMEMORY_ONLY
を使います。他のものを使用したい場合はpersist(StorageLevel.<*type*>)
を使用してください。
デフォルトでpersist()
は、データを非シリアル化オブジェクトとしてJVMヒープに格納します。
Cache()とpersist()の両方のメソッドは、火花計算のパフォーマンスを向上させるために使用されます。これらのメソッドは中間結果を保存するのに役立つので、それらは後の段階で再利用できます。
Cache()とpersist()の唯一の違いは、Persist()では中間結果を5つの記憶レベル(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER、MEMORY_AND_DISK_SER、 DISK_ONLY).