キャッシュと永続化の違いは何ですか?


回答:


222

ではcache()、デフォルトのストレージレベルのみを使用します。

  • MEMORY_ONLY以下のためのRDD
  • MEMORY_AND_DISK以下のためのデータセット

ではpersist()RDDデータセットの両方に必要なストレージレベルを指定できます。

公式ドキュメントから:

  • ()または()メソッドRDDを使用して、永続化するようにマークを付けることができます。persistcache
  • それぞれの永続化RDDは、別の方法で保存できますstorage level
  • cache()メソッドは、デフォルトのストレージ・レベルを使用するための省略形であるStorageLevel.MEMORY_ONLY(ストアはメモリ内のオブジェクトをデシリアライズ)。

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

  • MEMORY_ONLYRDD
  • またはMEMORY_AND_DISKのためのデータセット

公式ドキュメントへの興味深いリンク:選択するストレージレベル


17
MEMORY_AND_DISKをcache()使用することに注意してください
ximiki

上記のコメントは正しくないと思います。リンクaharsを使用して最新の公式ドキュメントを読むと、最後の箇条書きと一致します... cache()メソッドは、デフォルトのストレージレベルであるStorageLevel.MEMORY_ONLY(デシリアライズされたオブジェクトをメモリに格納)を使用するための省略形です。
user2596560

1
@ximiki MEMORY_AND_DISKは、データセットのみのデフォルト値です。MEMORY_ONLYまだRDDのデフォルト値です
ahars '10 / 10/28

1
@ user2596560コメントは、データセットのデフォルトのキャッシュ値に対して正しいです。MEDDRY_ONLYのデフォルト値をそのまま維持するRDDは正しい
ahars

83

cachepersist操作の違いは、純粋に構文上のものです。キャッシュは、persistまたはpersist(MEMORY_ONLY)の同義語です。つまり 、デフォルトのストレージレベルcacheのみpersistです。MEMORY_ONLY


/ ** *このRDDをデフォルトのストレージレベル(MEMORY_ONLY)で永続化します。* /
def persist():this.type = persist(StorageLevel.MEMORY_ONLY)

/ ** *このRDDをデフォルトのストレージレベル(MEMORY_ONLY)で永続化します。* /
def cache():this.type = persist()

詳細はこちら...


キャッシングまたは永続化は、(反復的でインタラクティブな)Spark計算の最適化手法です。それらは中間結果の保存に役立ち、後続の段階で再利用できます。RDDしたがって、これらの中間結果はs としてメモリ(デフォルト)に保持されるか、ディスクなどのより強固なストレージに保存されるか、複製されます。 RDDsは、cache操作を使用してキャッシュできます。また、persist操作を使用して永続化することもできます。

persistcache

これらの関数を使用して、のストレージレベルを調整できますRDD。メモリを解放するとき、Sparkはストレージレベルの識別子を使用して、保持するパーティションを決定します。パラメータless less 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)

ここに画像を入力

注:のキャッシングと永続性の間の非常に小さく純粋な構文上の違いによりRDD、2つの用語はしばしば同じ意味で使用されます。

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

メモリとディスクに永続化:

ここに画像の説明を入力してください

キャッシュ

キャッシングにより、アプリケーションのパフォーマンスを大幅に改善できます。

ここに画像の説明を入力してください


ブロック内にDFがありますが、どうすればアクセスできますか?
Bindumalini KK

48

違いはありません。から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種類のストレージレベルを提供します

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

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

デフォルトでpersist()は、データはシリアライズされていないオブジェクトとしてJVMヒープに格納されます。


4

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

cache()とpersist()の唯一の違いは、キャッシュ手法を使用して、必要な場合にのみ中間結果をメモリに保存できる一方で、Persist()では5つのストレージレベル(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER、MEMORY_AND_DISK_SER、 DISK_ONLY)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.