2016-12-14 6 views
2

1TBのデータベーステーブルに基づいてSpark DataFrameをロードするために1TBのメモリが必要かどうかを知るのは苦労しています。これは本当ですか?Spark:DataFrameを作成するために必要なメモリは、入力データのサイズと多少同じですか?

私はanother questionのSparkの方法ではやっていないと言われました。データフレームを繰り返し作成し、そのサブセットを処理することからデータをチャンクすることから始めました。問題は、並列処理が十分に行われていないため、これが遅すぎるということでした。そのフィードバックに基づいて、テーブル全体をロードしてSparkのパーティショニング/グループ化/並べ替えを使用して、必要な順序で必要なものを取得しようとしましたが、 30GBの小さなデータベーステーブル(私の場合)のために何千ものパーティションを持っているにもかかわらず、(私のローカルテストマシン上で)割り当てます。

私は過去数週間にわたって記事やドキュメントを検索して読んできたので、私は夢中になりました。実際にスパークの使用例を見つけるのは本当に苦労しています。ぼんやりと「大きな」データセットと呼ぶものにアクセスしてください。特に、DataFramesについて、実際のデータベースを入力として扱う場合にはそうです。さらに、データを手動でチャンクするべきではないというフィードバックを得ることで、すべてのデータが実際に一度に選択されるわけではないので、ある程度の魔法が必要になると思います。この点に関する有用な情報は、非常に高く評価されます。

次の場合にあなたがすべき間違い cache() RDDのとデータフレーム
+0

どのようにしているかサンプルコードをお願いしますか?それがアイデアを与えるように。 –

+0

@IndrajitSwain私は元のコードをさらに並列化するために何をしたいのかを見たい場合は、私がリンクしている他の質問にいくつかのコードがあります。そうでなければ、この最近のテストでテーブル全体をどのようにロードしようとしているのか疑問があるなら、 'spark.read'と' .option( "dbtable"、 " (select ... 'from(JDBC、Postgres)。 – Project707

+1

sparkのストレージタブを見てください。データフレームをキャッシュすると、どれくらいのスペースが消費されているか、現在どれくらいの量がメモリに残っているのか、 – jonathanChap

答えて

3

:反復ループ

  • でそれらを再利用

    • は、単一のアプリケーションでRDD複数回再利用し、仕事
    • 場合は初期費用がしますRDDパーティションを再生成するにはコストがかかります(HDFS、map()filter()などの複雑なセットの後)。これは、ワーカーノードが枯渇した場合の復旧処理に役立ちます。

    スパークは、LRUの方法でワーカーからRDDパーティションを自動的に削除することに注意してください。 LRU退去は各ワーカーで独立して発生し、ワーカーで使用可能なメモリに依存します。

    RDDのライフサイクル中に、RDDパーティションは、使用可能なメモリに応じて、クラスタ内のメモリまたはディスクに存在する可能性があります。

    Spark UIの[Storage]タブには、特定の時点におけるクラスタ内のパーティション(メモリまたはディスク)の存在場所が示されます。

    cache()persist(StorageLevel.MEMORY_ONLY)のエイリアスであり、利用可能なクラスタメモリより大きなデータセットには適していない可能性があります。メモリから追い出される各RDDパーティションは、高価なソース(HDFS、ネットワークなど)から再構築する必要があります。

    より良い解決策は、メモリから追い出された場合にRDDパーティションをワーカーのローカルディスクに流すことです。persist(StorageLevel.MEMORY_AND_DISK_ONLY)を使用することをお勧めします。この場合、パーティションを再構築するには、作業者のローカルディスクから比較的高速なデータを取得する必要があります。

    また、_SERを次のように追加してシリアル化バイト配列としてデータを保持することもできます。MEMORY_SERおよびMEMORY_AND_DISK_SER。これはスペースを節約できますが、追加の直列化/逆シリアル化のペナルティが発生します。また、シリアル化されたバイト配列としてデータを格納するため、Javaオブジェクトが少なくなり、GCの負荷が軽減されます。

    Spark Storage Level

  • +0

    元の質問を参照すると、DataFrameを作成しているテーブルのサイズと同じくらい多くのメモリは必要ありませんが、その尺度でディスク容量とメモリの組み合わせが必要ですあなたが 'MEMORY_AND_DISK_ONLY'を使用している限り? もしそうなら、答えを更新してより直接的にメインの質問に答えてください。 – Project707

    +0

    またこれを効果的に利用するには、' persist(StorageLevel.MEMORY _AND_DISK_ONLY) 'を生成します。 'spark.read ....その他の設定.load()'と再パーティション化のようなアクションの前に? – Project707

    +0

    データフレームを繰り返し使用する場合は常に基本的なルールです。それを常に維持するのがより良いでしょう。親RDDが最終的にRDDになる場合はそれを永続化するか、それ以外の場合はフィルタとその後の任意の操作それを維持する。親RDDまたはデータフレームではありません。どちらがより多くのメモリを要するか。 –

    関連する問題