2017-12-16 11 views
1

Sparkを使用して約1500のリモートOracleテーブルからデータを取得したいと思っていましたが、スレッドごとにテーブルをピックアップするマルチスレッドアプリケーションそれぞれのテーブルから読み取るスパークジョブを起動します。スパークは、アプリケーション間でのスケジューリングのための設備を提供で実行されていることを公式火花サイトからマルチスレッドドライバからApache Spark SQLジョブを起動する

それは、これが働くことができることは明らかだhttps://spark.apache.org/docs/latest/job-scheduling.html ...

...クラスタマネージャ。次に、各Sparkアプリケーション内で、複数の「ジョブ」(Sparkアクション)が異なるスレッドによってサブミットされた場合、同時に実行されている可能性があります。アプリケーションがネットワーク経由で要求を処理している場合は、これが一般的です。 Sparkには、各SparkContext内でリソースをスケジュールするための公平なスケジューラが含まれています。

あなたはSOあり、この同様の質問には受け入れ答えはなかったし、ほとんどのupvoted答えは

で始まる。これは、スパーク

の精神で実際にはないことを Concurrent job Execution in Spark投稿この中で気づいたかもしれませんが
  1. 誰もが、それはスパークの精神が何であるかを気にスパーク
  2. の「精神」ではありません知っていますか?実際には何も意味しません。

誰もこれまでのように何かを手に入れましたか?特別なことをしなければなりませんでしたか?私は多くの作業時間を無駄にする前に、ちょっとした指針を求めていました。私は本当にこれに関する助けに感謝します!

+1

分散ワーカープールを持つのは、ワーカーマネージャを活用してドライバーノードではなく、クラスター自体のジョブをスケジュールすることなので、Sparkの精神ではありません。なぜ、複数のドライバではなく、sparkcontextごとに複数のジョブレット/タスクが必要で、通常の抽象化を使用します(ドライバ→ワーカー→ドライバ→実際のワーカー)。何らかの理由で糸クライアントまたはスタンドアロンモードに強制されていますか? – cowbert

+0

実際には現在私は糸クライアントモードに強制されています。私はツェッペリンですべてをやっている。しかし、私がいなくても、仕事のすべてがまったく同じことをしているので、むしろ1つのアーティファクト(1人のドライバー)しか持たないだろう。少なくとも、フェアスケジューラが私の代わりに仕事のスケジューリングをよりうまく処理するかどうかを確認することは、面白いテストです。また、Sparkのドキュメントによると、これはネットワークアプリケーションの実行方法であり、それは変わったものではない –

+1

私がここで使用する技術について説明しました:https://stackoverflow.com/a/47733522/1138523 –

答えて

4

sparkコンテキストはスレッドセーフなので、多くのスレッドから並列に呼び出すことができます。 (私は本番環境で行っています)

実行中のスレッドの数を制限することに注意してください。
1.実行スレッドのメモリはすべてのスレッド間で共有されており、OOMキャッシュから常にメモリ内外にスワップする
2. CPUが制限されているため、コアよりも多くのタスクが改善されません。

+0

ドライバプログラムは共有しませんタスクを実行しているエグゼクティブドライバプログラムは、スパークジョブを提出するプログラムです。つまり、ジョブを送信したスレッドは、タスクを表すスレッドに干渉しません。また、タスクを処理するよりも多くのパーティションを処理することが理にかなっています。エグゼキュータがCPUおよび/または使用可能なメモリをスケジュール設定しないように設定されていることを確認してください。パーティションの数が増えるにつれて、タスクの分散が向上し、あるエグゼキュータが突然別のものより長く処理する必要がなくなります。 – YoYo

1

マルチスレッドアプリケーションでジョブをサブミットする必要はありませんあなたがそうすることができなかった理由はありません)。あなたの仕事を個々のプロセスとして提出するだけです。これらのジョブを一度に1つずつ提出し、プロセスをバックグラウンドにプッシュするか、糸クラスターモードで提出するスクリプトを用意してください。 スケジューラ(糸、mesos、スパーククラスタ)は、メモリおよび/またはCPUの可用性に基づいて、すべてのスケジューラが同時に実行できる余地がないため、ジョブの一部を待機させます。

複数のパーティションを使用してテーブルを処理すると、私はあなたのアプローチに利点があることに注意してください。また、多くのテーブルを処理する必要があるため、どれだけのメリットがあるかわかりません。テーブル・データを使って何をするかによって、より簡単になり、単一のスレッド・ジョブと非スパーク・ジョブを複数実行させることができます。

また、@cowbert氏のメモを参照してください。

関連する問題