ビッグデータ開発-Spark-RDDの永続性とキャッシング

1.RDDキャッシングメカニズムキャッシュ、永続化

Sparkが非常に高速である理由の1つは、RDDがキャッシングをサポートしていることです。キャッシュが成功した後、データセットが後続の操作で使用される場合、データセットはキャッシュから直接取得されます。キャッシュにも損失のリスクがありますが、RDD間の依存関係により、特定のパーティションのキャッシュデータが失われた場合、パーティションのみを再計算する必要があります。

関係する演算子:永続化、キャッシュ、非永続化;すべてが変換です

キャッシュは、計算結果をさまざまなメディア、ユーザー定義および定義可能なストレージレベルに書き込むことです(ストレージレベルはキャッシュストレージメディアを定義し、現在、メモリ、オフヒープメモリ、ディスクをサポートしています)。

キャッシュにより、SparkはRDDでの繰り返し計算を回避し、計算速度を大幅に向上させることができます。RDDの永続性またはキャッシュは、Sparkの最も重要な機能の1つです。キャッシュは、Sparkが反復アルゴリズムと高速なインタラクティブクエリを構築するための重要な要素であると言えます。

Sparkが非常に高速である理由の1つは、データセットをメモリに永続化(またはキャッシュ)することです。RDDが永続化されると、各ノードは計算された断片化の結果をメモリに保存し、このデータセット(または派生データセット)で実行される他のアクション(アクション)で再利用します。これにより、後続のアクションが高速になります。persist()メソッドを使用して、RDDを永続としてマークします。「永続的としてマーク」と言う理由は、persist()ステートメントが表示される場所では、RDDはすぐには計算および永続化されませんが、最初のアクション操作が実際の計算をトリガーするまで計算されないためです。計算結果は永続化される; persist()またはcache()メソッドを介して、永続化されるRDDにマークを付け、永続性をトリガーし、RDDをコンピューティングノードのメモリに保持して再利用します。

データをキャッシュする場合、スペースと速度の間にはトレードオフがあります。一般に、特定のRDDが複数のアクションに必要であり、その計算コストが高い場合は、このRDDをキャッシュする必要があります。

メモリ不足により、キャッシュが失われたり、メモリに保存されているデータが削除されたりする場合があります。RDDキャッシュのフォールトトレラントメカニズムにより、キャッシュが失われた場合でも計算を正しく実行できます。RDDに基づく一連の変換を通じて、失われたデータが再計算されます。RDDの各パーティションは比較的独立しているため、すべてのパーティションを再計算するのではなく、欠落している部分のみを計算する必要があります。

オフヒープメモリを開始するには、次の2つのパラメータを設定する必要があります。

  • spark.memory.offHeap.enabled:オフヒープメモリを有効にするかどうか。デフォルト値はfalseであり、trueに設定する必要があります。
  • spark.memory.offHeap.size:オフヒープメモリスペースのサイズ。デフォルト値は0であり、正の値に設定する必要があります。

1.1キャッシュレベル

Sparkが非常に高速である理由の1つは、RDDがキャッシングをサポートしていることです。キャッシュが成功した後、データセットが後続の操作で使用される場合、データセットはキャッシュから直接取得されます。キャッシュにも損失のリスクがありますが、RDD間の依存関係により、特定のパーティションのキャッシュデータが失われた場合、パーティションのみを再計算する必要があります。

ファイル

ファイル

Sparkは複数のキャッシュレベルをサポートしています。

ストレージレベル 意味
MEMORY_ONLY デフォルトのキャッシュレベルは、RDDを逆シリアル化されたJavaオブジェクトとしてJVMに格納します。メモリスペースが十分でない場合、一部のパーティションデータはキャッシュされなくなります。
MEMORY_AND_DISK RDDを逆シリアル化されたJavaオブジェクトとしてJVMに格納します。メモリスペースが十分でない場合は、キャッシュされていないパーティションデータをディスクに保存し、これらのパーティションが必要になったときにディスクから読み取ります。
MEMORY_ONLY_SER RDDをシリアル化されたJavaオブジェクトとして格納します(各パーティションはバイト配列です)。この方法は、オブジェクトを逆シリアル化するよりもストレージスペースを節約しますが、読み取り時のCPUの計算負荷が増加します。JavaとScalaのみがサポートされています。
MEMORY_AND_DISK_SER 同様MEMORY_ONLY_SERですが、オーバーフローしたパーティションデータは、使用時に再計算されるのではなく、ディスクに保存されます。JavaとScalaのみがサポートされています。
DISK_ONLY RDDをディスクにのみキャッシュする
MEMORY_ONLY_2MEMORY_AND_DISK_2 機能は上記の対応するレベルと同じですが、各パーティションはクラスター内の2つのノードに複製されます。
OFF_HEAP MEMORY_ONLY_SER似ていますが、データは、ヒープ内の外部メモリに保存されています。これには、オフヒープメモリを有効にする必要があります。

オフヒープメモリを開始するには、次の2つのパラメータを設定する必要があります。

  • spark.memory.offHeap.enabled:オフヒープメモリを有効にするかどうか。デフォルト値はfalseであり、trueに設定する必要があります。
  • spark.memory.offHeap.size:オフヒープメモリスペースのサイズ。デフォルト値は0であり、正の値に設定する必要があります。

1.2キャッシュを使用する

データをキャッシュする方法は2つあります:persistcachecache内部persistも呼ばれpersist、特殊な形式であり、と同等persist(StorageLevel.MEMORY_ONLY)です。例は次のとおりです。

// 所有存储级别均定义在 StorageLevel 对象中
fileRDD.persist(StorageLevel.MEMORY_AND_DISK)
fileRDD.cache()

キャッシュされたRDDには、DAGグラフに緑色の点があります。

ファイル

1.3キャッシュを削除する

Sparkは、各ノードのキャッシュ使用量を自動的に監視し、最も使用頻度の低い(LRU)ルールに従って古いデータパーティションを削除します。もちろん、このRDD.unpersist()方法を使用して手動で削除することもできます

2.RDDフォールトトレランスメカニズムチェックポイント

2.1関係するオペレーター:チェックポイント;また変換

Sparkは、永続化操作に加えて、データ保存のためのチェックポイントメカニズムも提供します。チェックポイントの本質は、信頼性の高いディスクにRDDを書き込むことであり、主な目的はフォールトトレランスです。チェックポイントは、HDFSファイルシステムにデータを書き込むことによって実現されます

RDDチェックポイント機能。系統が長すぎると、フォールトトレランスのコストが高くなりすぎるため、中間段階でチェックポイントフォールトトレランスを実行することをお勧めします。ノードに問題があり、パーティションが失われた場合は、

チェックポイントされたRDDはリネージュのやり直しを開始します。これによりオーバーヘッドが削減されます。

2.2キャッシュとチェックポイントの違い

キャッシュとチェックポイントには大きな違いがあります。キャッシュはRDDを計算してメモリに保存しますが、RDDの依存関係チェーンを削除することはできません。エグゼキュータが特定のポイントでダウンすると、上のキャッシュのRDDはドロップされ、依存関係チェーンのリプレイ計算に合格する必要があります。違いは、チェックポイントが

RDDはHDFSに保存され、複数のコピーの信頼できるストレージです。この時点で、依存関係チェーンが失われる可能性があるため、依存関係チェーンは切断されます。

2.3チェックポイントはシーンに適しています

次のシナリオは、チェックポイントメカニズムの使用に適しています。

1)DAGの系統が長すぎる、再計算するとオーバーヘッドが大きくなりすぎる

2)広い依存性にチェックポイントを行うと、より大きなメリットが得られます

キャッシュと同様に、チェックポイントも怠惰です。

val rdd1 = sc.parallelize(1 to 100000)
// 设置检查点目录

sc.setCheckpointDir("/tmp/checkpoint")

val rdd2 = rdd1.map(_*2)

rdd2.checkpoint

// checkpoint是lazy操作

rdd2.isCheckpointed

// checkpoint之前的rdd依赖关系

rdd2.dependencies(0).rdd

rdd2.dependencies(0).rdd.collect

// 执行一次action,触发checkpoint的执行

rdd2.count

rdd2.isCheckpointed

// 再次查看RDD的依赖关系。可以看到checkpoint后,RDD的lineage被截断,变成从checkpointRDD开始

rdd2.dependencies(0).rdd

rdd2.dependencies(0).rdd.collect

//查看RDD所依赖的checkpoint文件

rdd2.getCheckpointFile 

備考:チェックポイントのファイル操作は実行後に削除されません。WuXie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能分野。もっと注意してくださいファイル

おすすめ

転載: blog.csdn.net/hu_lichao/article/details/112760214