これらの場合、大きなファイルはどうなりますか?
1)Spark NameNodeからデータの場所を取得します。Spark NameNodeからの情報に従ってデータサイズが長すぎるため、これと同時に停止しますか?
2)Sparkデータノードのブロックサイズに従ってデータの分割を行いますが、すべてのデータをメインメモリに保存することはできません。ここではStorageLevelを使用していません。ここで何が起こりますか?
3)Sparkデータを分割します。このメインメモリストアのデータが再び処理されると、一部のデータがメインメモリに格納されますsparkは、ディスクから他のデータをロードします。
まず、Sparkは、アクション(count
、collect
またはwrite
など)が呼び出されたときにのみデータの読み取りを開始します。 Sparkデータをデータにロードするpartitions-同時にロードされるパーティションの数は、使用可能なコアの数によって異なります。したがって、Spark 1パーティション= 1コア= 1タスクと考えることができます。同時にロードされるすべてのパーティションがメモリに収まる必要があることに注意してください。そうしないと、OOMが表示されます。
複数のステージがあると想定すると、Sparkは、ロードされたパーティションのみで最初のステージから変換を実行します。ロードされたパーティションのデータに変換を適用すると、出力は次のように保存されます。すべてのデータが読み取られるまで、これらのパーティションに変換を適用し、出力をshuffle-dataとして格納し、さらにパーティションを読み取っていくなどの処理を行います。
変換を適用せず、たとえばcount
のみを実行する場合、Sparkはパーティション内のデータを読み取りますが、クラスターにデータを格納しません。もう一度count
を実行すると、すべてのデータがもう一度読み込まれます。データが何度も読み込まれるのを防ぐには、cache
またはpersist
を呼び出すことができます。この場合、Spark willクラスターにデータを保存しようとします。cache
(これはpersist(StorageLevel.MEMORY_ONLY)
と同じです)は、すべてのパーティションをメモリに保存します-メモリに収まらない場合はOOMが返されます。persist(StorageLevel.MEMORY_AND_DISK)
を呼び出すと、メモリにできるだけ多く保存され、残りはディスクに配置されます。データが収まらない場合ディスク上では、OSは通常、ワーカーを殺します。
Sparkには独自の小さなメモリ管理システムがあります。Sparkジョブに割り当てるメモリの一部は、作業中のデータを保持するために使用され、 cache
またはpersist
を呼び出すと、メモリの一部がストレージに使用されます。
この説明がお役に立てば幸いです:)
これは、Apacheから直接引用されていますSpark FAQ( FAQ | Apache Spark )
Sparkを使用するには、データをメモリに収める必要がありますか?
いいえ。Sparkのオペレーターは、メモリに収まらない場合、データをディスクにこぼし、あらゆるサイズのデータで適切に実行できるようにします。同様に、メモリに収まらないキャッシュされたデータセットは、RDDのストレージレベルによって決定されるように、ディスクに書き出されるか、必要に応じてその場で再計算されます。
Apacheでは、Sparkデータがメモリに収まらない場合、Sparkは単にそのデータをディスクに永続化します。
Apacheの永続化メソッドSpark=は、データを永続化するための6つの永続ストレージレベルを提供します。
MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER
(Java and Scala), MEMORY_AND_DISK_SER
(Java and Scala), DISK_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK_2, OFF_HEAP.
OFF_HEAPストレージは実験中です。