web-dev-qa-db-ja.com

sparkファイルがスパークのメインメモリに収まらない場合に大きなファイル(ペタバイト)を読み取る方法

これらの場合、大きなファイルはどうなりますか?

1)Spark NameNodeからデータの場所を取得します。Spark NameNodeからの情報に従ってデータサイズが長すぎるため、これと同時に停止しますか?

2)Sparkデータノードのブロックサイズに従ってデータの分割を行いますが、すべてのデータをメインメモリに保存することはできません。ここではStorageLevelを使用していません。ここで何が起こりますか?

3)Sparkデータを分割します。このメインメモリストアのデータが再び処理されると、一部のデータがメインメモリに格納されますsparkは、ディスクから他のデータをロードします。

10
Arpit Rai

まず、Sparkは、アクション(countcollectまたは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ストレージは実験中です。

0
Swadeshi