web-dev-qa-db-ja.com

cacheとpersistの違いは何ですか?

RDDの永続性に関しては、cache()persist()の違いは何ですか?

193
Ramana

cache()では、デフォルトのストレージレベルMEMORY_ONLYのみを使用します。 persist()を使うと、どの記憶域レベルを希望するかを指定できます( rdd-persistence )。

公式文書より:

  • RDD()またはpersist()メソッドを使用して、cacheを永続化するようにマークできます。
  • 永続化された各RDDは、異なるstorage levelを使用して格納できます。
  • cache()メソッドは、デフォルトの記憶レベルであるStorageLevel.MEMORY_ONLY(逆シリアル化されたオブジェクトをメモリに格納する)を使用するための省略形です。

RDDMEMORY_ONLY以外のストレージレベルを割り当てる場合はpersist()を使用します( 選択するストレージレベル

208
ahars

キャッシングまたは永続化は、(反復的および対話的な)Spark計算のための最適化手法です。それらは暫定的な部分的な結果を保存するのを助けますので、それらは後の段階で再利用することができます。 RDDsとしてのこれらの暫定的な結果は、このようにメモリ(デフォルト)またはディスクのようなより強固なストレージに保持されたり、複製されたりします。 RDDsはcache操作を使用してキャッシュできます。 persist操作を使って永続化することもできます。

persistcache

これらの関数はRDDの格納レベルを調整するために使うことができます。メモリを解放するとき、Sparkはどのパーティションを保持するべきかを決定するためにストレージレベル識別子を使います。パラメーターなしの変種persist()およびcache()は、persist(StorageLevel.MEMORY_ONLY).の単なる省略形です。

警告:一度ストレージレベルを変更すると、それを再び変更することはできません。

警告 - 慎重にキャッシュしてください...( (なぜ)キャッシュを呼び出す必要がありますか、それともRDDに永続化する必要があります

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)

enter image here

cache操作とpersist操作の違いは、純粋に構文上のものです。 cacheはpersistまたはpersist(MEMORY_ONLY)の同義語です。つまり、cacheは単にデフォルトのストレージレベルMEMORY_ONLYを持つpersistです。

注:RDDsのキャッシングと永続化の間には非常に小さく純粋に構文上の違いがあるため、この2つの用語はしばしば同じ意味で使用されています。

ここでもっと視覚的に見てください....

メモリとディスクに固執する:

enter image description here

キャッシュ

キャッシングは、アプリケーションのパフォーマンスを大幅に向上させることができます。

enter image description here

79
Ram Ghadiyaram

違いはありません。 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()
46
Mike Park

Sparkは5種類の収納レベルを提供

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()MEMORY_ONLYを使います。他のものを使用したい場合はpersist(StorageLevel.<*type*>)を使用してください。

デフォルトでpersist()は、データを非シリアル化オブジェクトとしてJVMヒープに格納します。

21
Ketan Keshri

Cache()とpersist()の両方のメソッドは、火花計算のパフォーマンスを向上させるために使用されます。これらのメソッドは中間結果を保存するのに役立つので、それらは後の段階で再利用できます。

Cache()とpersist()の唯一の違いは、Persist()では中間結果を5つの記憶レベル(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER、MEMORY_AND_DISK_SER、 DISK_ONLY).

1
user11332824