RDDをキャッシュするメリット
そのRDDに対してアクションを複数回呼ぶ場合、キャッシュから読み込むため、再計算する必要がなくなる。
すべてのRDDは常にキャッシュするべきか? -> いいえ
- 一度しかアクションされないRDDをキャッシュする意味がない
- 複数回アクションされる場合でも、再計算する方が低コストになる場合も
キャッシュを持つノードが障害が発生した場合は?
- 再計算される(仮にそのキャッシュが既に不要の場合、無駄な再計算になりそう)
- MEMORY_AND_DISK_2 のように、複数台でキャッシュするようにしておけば、再計算を避けられる
StorageLevel 一覧
StorageLevel | 永続先 | シリアライズ | メリット | デメリット |
---|---|---|---|---|
NONE | なし | なし | メモリ・ディスク領域消費しない | アクションの毎に再計算 |
MEMORY_ONLY | メモリ | なし | レイテンシ低い | メモリ消費量多い(GCのオーバーヘッド高) |
MEMORY_ONLY_SER | メモリ | あり | メモリ消費量少ない | シリアライズのオーバーヘッド(CPU負荷)高 |
DISK_ONLY | ディスク | なし | メモリ消費しない | レイテンシ高い |
MEMORY_AND_DISK | メモリとディスク | なし | レイテンシ低い | メモリ消費量多い(GCのオーバーヘッド高) |
MEMORY_AND_DISK_SER | メモリとディスク | あり | メモリ消費量少ない | シリアライズのオーバーヘッド(CPU負荷)高 |
OFF_HEAP | Tachyonファイルシステム(メモリ上) | あり | GC発生しない | Tachyon要インストール、実績少ない? |
どの StorageLevel を選択するべきか?
対象のRDDが何度アクションを呼び出されるのか、どのようなアクションなのか、どの程度のサイズになるのか、などに依存する。
とにかく再計算を避けたいのであれば、MEMORY_AND_DISK を選択するのが無難なようにも思えるが、実はトータル的にはパフォーマンスを低下している可能性も考えておく。