Apache Sparkの永続性について

読み時間:4分

このブログでは、シナリオベースの例を使用して、Apache Sparkの永続性の概念を非常に素人の言葉で理解しようとします。
注:シナリオはあなたの理解を容易にするためのものです。

注:キャッシュメモリはエグゼキューター間で共有できます。

RDDを永続化/キャッシュすることはどういう意味ですか?

Spark RDD persistenceは、RDD評価の結果をキャッシュメモリに保存する最適化手法です。 これを使用して、中間結果を保存して、必要に応じてさらに使用できるようにします。 これにより、計算のオーバーヘッドが削減されます。RDDを永続化すると、各ノードは計算するパーティションをメモリに格納し、そのRDD(またはそれから派生したRDD)の他のアクションでそれらを再利用します。 これにより、将来のアクションをはるかに高速にすることができます(多くの場合、10倍以上)。 キャッシュは、反復アルゴリズムと高速な対話型使用のための重要なツールです。

persist()またはcache()メソッドを使用して、RDDを永続化するようにマークすることができます。 アクションで初めて計算されるときは、ノードのキャッシュメモリに保持されます。 RDDのいずれかのパーティションが失われた場合、rddを最初に作成した変換を使用して自動的に再計算されます。

私はこの変換を持っているとしましょう–

RDD3 => RDD2 => RDD1 => Text FileRDD4 => RDD3RDD5 => RDD3

RDD3はRDD2から作成され、RDD2はRDD1から作成されます。 RDD3で変換を行うたびに、RDD2とRDD1を何度も再計算する必要があります。

RDD4.collect()RDD5.collect()

ここでは、変換のチェーン全体を2回計算する必要があります。しかし、このRDD3をワーカーノードのキャッシュメモリに永続化することができるので、使用するたびにRDD2とRDD1を再計算する必要はありません。ここで、RDD5を計算するために、SparkはキャッシュメモリからRDD3を読み取り、結果を生成します。 したがって、RDD2とRDD1はRDD5

のために再計算されません注:rdd。cache()はrddと同じです。persist()

永続性レベル

ストレージの場所

–MEMORY_ONLY(デフォルト)–キャッシュ
rddと同じです。永続化(StorageLevel.MEMORY_ONLY)またはrdd。persist()

–MEMORY_AND_DISK–メモリに収まらないパーティションをディスクに格納します(これはスピリングとも呼ばれます)
rdd。永続化(StorageLevel.MEMORY_AND_DISK)

–DISK_ONLY–ディスク
rdd上のすべてのパーティションを格納します。永続化(StorageLevel.DISK_ONLY)

–MEMORY_ONLY(デフォルト)–これは最も簡単で、最も推奨されます。 RDDのすべてのパーティションをキャッシュメモリに格納します。

–DISK_ONLY–RDD(RDD1という名前)があり、そのRDDの計算が非常に複雑で(時間がかかり、MLアルゴリズムを適用した後に作成されます)、RDDのサイズが巨大で、ワーカーノードの利用可能なキャッシュメモリが少ないため、RDDをキャッシュメモリに保存することはできません。 この場合、RDDをディスクに保存できます。

ディスクに保存するポイントは何ですか?確かに、RDDをディスクに格納するとI/Oが発生し、時間がかかります。 しかし、I/Oに時間がかかるのか、RDDの再計算に時間がかかるのかを確認する必要があります。 ここで、I/OがRDDの再計算にかかる時間が少ないことが判明した場合、その場合はRddをディスクに格納する方がよいでしょう。したがって、次回の変換でRDD1が必要なときはいつでも、SparkはI/O操作を実行し、それをExecutorのメモリに持ちます。

RDD1.永続化(StorageLevel.DISK_ONLY)

–MEMORY_AND_DISK–Executorのメモリに3つのRdd(キャッシュされていない)があり、利用可能なメモリが残っていないとしましょう。 一方、別のRDD(RDD4など)が登場します。 そのため、SparkはExecutorのメモリから最も最近使用されていない(LRU)RDDを削除し、新しいRDDが入るためのスペース(この場合はRDD4)を作成します。

さて、3つのRddがメモリにキャッシュされ、RDD4が到着したときにLRUがワーカーノードのキャッシュメモリからRDDをキックアウトしないと仮定しましょう。 そして、OOMの問題がある可能性があります。しかし、RDD4でMEMORY_AND_DISK永続レベルを使用すると、キャッシュメモリに十分なスペースが見つからない場合、Rdd4はディスクに格納されます。

RDD4.永続化(StorageLevel.MEMORY_AND_DISK)

また、巨大なRDDがメモリにキャッシュされ、十分なキャッシュメモリがない場合、MEMORY_AND_DISKを使用すると、キャッシュメモリに収まらない残りのパーテ

ここでも課題はI/O操作です。

メモ:ディスクに保存されているデータはtmpの場所に格納されます。

メモリフォーマット

シリアル化–キャッシュメモリに格納されているデータをシリアル化することができます。

MEMORY_ONLY_SERとMEMORY_AND_DISK_SER

RDDをシリアル化された(バイナリ)形式で永続化すると、RDDのサイズが小さくなり、より多くのRDDがキャッシュメモリに永続化される したがって、これらの2つのメモリ形式はスペース効率が高いです。

しかし、これの問題は、データの逆シリアル化にかかる時間のコストを負担する必要があるため、時間効率が低いことです。

だから、パフォーマンスが重要かストレージが重要かは開発者の選択です。 確かに、パフォーマンスへの影響はあまりありませんが、それは分のものになります。

パーティションレプリケーション

は、パーティションを二つのノードに格納します。

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

これらのオプションは、RDDの複製されたコピーを他のワーカーノードのキャッシュメモリにも格納します。

ディスク上の複製されたデータは、パーティションを再作成するために使用されます。 他のワーカーノードがダウンした場合にRDDを再計算するのに役立ちます。

RDDの永続化を解除する

–永続化を停止してメモリまたはディスクから削除する
–RDDの永続化レベルを変更する
rdd。unpersist()

だから、これはApache Sparkのキャッシュメモリをどのように扱うことができますか。

これはすべてこのブログからです、あなたがそれを楽しんで、それがあなたを助けたことを願っています!! より多くの将来のブログのための接続を維持します。 ありがとうございました!!

コメントを残す

メールアドレスが公開されることはありません。