.cache()
データセットの永続的なキャッシュにRDD を使用していますが、このキャッシュがいつ期限切れになるのか心配です。
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
.cache()
データセットの永続的なキャッシュにRDD を使用していますが、このキャッシュがいつ期限切れになるのか心配です。
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
回答:
Sparkがメモリ不足になるまで期限切れになりません。その時点で、使用頻度が最も低いRDDがキャッシュから削除されます。キャッシュされていないものを要求すると、パイプラインが再計算され、再度キャッシュに入れられます。これが高すぎる場合は、他のRDDを永続化しないか、最初にそれらをキャッシュしないか、ファイルシステムに永続化しないでください。
Janの回答に加えて、シリアル化されたRDD ストレージ(/ caching)は、大規模なデータセットの通常のRDDキャッシュよりもはるかにうまく機能することを指摘しておきます。
また、データセットが大きい場合のガベージコレクションの最適化にも役立ちます。
さらに、spark docsから:
この調整にもかかわらずオブジェクトがまだ大きすぎて効率的に格納できない場合、メモリ使用量を削減するはるかに簡単な方法は、MEMORY_ONLY_SERなどのRDD永続化APIでシリアル化されたStorageLevelsを使用して、シリアル化された形式でオブジェクトを格納することです。次に、Sparkは各RDDパーティションを1つの大きなバイト配列として格納します。シリアル化された形式でデータを保存することの唯一の欠点は、その場で各オブジェクトを逆シリアル化する必要があるため、アクセス時間が遅くなることです。シリアル化された形式でデータをキャッシュしたい場合は、Kryoを使用することを強くお勧めします。これは、Javaのシリアル化よりも(そして、未加工のJavaオブジェクトよりも)サイズがはるかに小さくなるためです。
MEMORY_ONLY_SER
PythonではなくScala / Javaでのみ利用可能です。