キャッシュとチェックポイントをDataSetで一緒に使用する必要がありますか?もしそうなら、これは内部でどのように機能しますか?

オイレクチン

より大きなデータセットでOOMエラーが発生するSparkMLパイプラインに取り組んでいます。トレーニング前は、cache();を使用していましたこれを交換したところcheckpoint()、メモリ要件が大幅に低下しました。ただし、のドキュメントには次RDDcheckpoint()ように記載されています。

このRDDをメモリに保持することを強くお勧めします。そうしないと、ファイルに保存するときに再計算が必要になります。

DataSet私が使用しているのチェックポイントについても、同じガイダンスは提供されていませんとにかく上記のアドバイスに従って、私はメモリ要件が実際にcache()単独で使用することからわずかに増加することを発見しました

私の期待は、

...
ds.cache()
ds.checkpoint()
...

チェックポイントへの呼び出しは、チェックポイントDataSetされる前に同時にキャッシュされるの評価を強制します。その後、へのds参照はキャッシュされたパーティションを参照し、より多くのメモリが必要でパーティションが退避した場合、チェックポイントされたパーティションが再評価されるのではなく使用されます。これは本当ですか、それとも内部で何か違うことが起こりますか?理想的には、可能であればDataSetをメモリに保持したいのですが、メモリの観点からは、キャッシュとチェックポイントのアプローチを使用することに何のメリットもないようです。

user10938362

TL; DR後続のアクションでは、メモリ内キャッシュ(のデフォルトのストレージレベルDatasetMEMORY_AND_DISKとにかく)のメリットはありませんが、コンピューティングdsにコストがかかる場合、キャッシュを検討する必要があります

説明

あなたの期待は

ds.cache()
ds.checkpoint()
...

チェックポイントを呼び出すと、DataSetの評価が強制されます

正しい。Dataset.checkpointさまざまなフレーバーがあり、熱心なチェックポイントと怠惰なチェックポイントの両方が可能であり、デフォルトのバリアントは熱心です

def checkpoint(): Dataset[T] = checkpoint(eager = true, reliableCheckpoint = true)

したがって、後続のアクションではチェックポイントファイルを再利用する必要があります。

ただし、内部はSparkが内部適用されるcheckpointRDDだけなので、評価のルールは変更されていません。Sparkは最初にアクションを評価し、次に作成しますcheckpoint(そのため、最初にキャッシュが推奨されました)。

したがって、省略するds.cache() dsと、次のように2回評価されds.checkpoint()ます。

  • 内部count用に1回
  • 実際に一度checkpoint

したがって、何も変更されておらず、cache引き続き推奨されますがRDDDatasetキャッシュは計算コストが高いと見なされるため、推奨はプレーンと比較してわずかに弱い可能性があり、コンテキストによっては、単にデータをリロードする方が安価な場合があります(通常Dataset.countなしcacheは最適化されますが、Dataset.countwith cacheis not-スパークのカウントを使用して熱心な評価を強制するパフォーマンスの問題はありますか?)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ