JavaプログラムをApache Sparkに移行する必要があります。現在のJavaは、java.util.concurrentによって提供される機能を大いに利用し、単一のマシン上で動作します。ワーカー(Callable)の初期化は高価なので、ワーカーは何度も再利用されます。つまり、ワーカーが終了してその結果を返すと、ワーカーは自分自身をプールに再挿入します。高価な移行でjava.util.concurrent.CallablesをApache Sparkに初期化する
より正確:
- 現在の実装では、10E06エントリ/数GB単位の範囲内の小さなデータセット上で動作します。
- データには、個別に処理できるエントリが含まれています。つまり、タスクごとに1人のワーカーを起動して、それをJavaスレッドプールに送信できます。
- しかし、エントリを処理するためのワーカーを設定するには、より多くのデータをロードしたり、グラフを作成したりする必要があります。
- 実際に、一部のデータは作業者間で共有することができます。いくつかのルックアップテーブルが必要ではありません。一部のデータは従業員にプライベートであるため、共有されません。作業者は、エントリを処理している間にデータを変更し、後でそれを迅速にリセットするだけでよい。現在処理中のエントリに固有のキャッシュ。したがって、作業者はプール内に自分自身を再挿入し、高価な初期化を行わずに次の作業を開始することができます。
- ワーカー1人あたりの実行時間とエントリの範囲は秒です。
- ワーカーは結果をExecutorCompletionService経由で返します。つまり、プログラムの中央でpool.take()。get()を呼び出して結果を取得します。
Apache Sparkについて知っているほとんどの例は、標準の変換と動作を使用しています。私はまた、add their own functions to the DAG by extending the APIの例を見つける。それでも、これらの例はすべて単純な軽量計算に固執しており、初期化コストはかかりません。
私は、何らかの種類の「重労働」を再利用するSparkアプリケーションを設計するための最良のアプローチが何であるか疑問に思っています。エグゼクティブは、そのような労働者のプールを保持できる唯一の永続的な存在であるように思われる。ただし、関数を使用してsolution(可能性)を指すanswerを発見20161007
を編集した...
私が最も可能性の高いいくつかのポイントを見逃しスパークの世界に新しいもの。そこで問題は、私は
- スプリット各エグゼキュータは正確に一つのパーティションを取得します
- エグゼキュータの数に応じて、私のパーティションは、
- My機能で作業することが可能である(リンクsolutionでセットアップと呼ばれます)スレッドプールを作成し、労働者
- に別の結合機能を再利用し、後で結果
の詳細はあなたの現在のJava実装が実際に何をするかについて、もう少し具体的にすることができ、あなたがメモリ不足に文句を言わないことを確実にするためにMEMORY_AND_DISKに永続化モデルを設定することができますか? Sparkの主なセールスポイントはRDDであり、操作はAPIのもので定義されています。おそらく共有メモリなどに依存するアプリケーションを複数のノードにスケールアウトするためにSparkを悪用しようとしているように私には聞こえます。アプリケーションがデータの処理を行う場合、Spark APIを使用してアプリケーションを実行しようとしましたか? – LiMuBei
@LiMuBei現在のJava実装の詳細な説明が追加されました。私はまだそのデザインが「虐待」かどうか評価しています。 [Spark API](http://spark.apache.org/docs/latest/api/java/index。)から。html)すなわち.javaと.java.function私は私自身の関数を追加することができます。しかし、私はそれらがどのように実行されるかをほとんど制御できません。おそらく、それはスパークの全体のポイントです - その乱雑なものを隠している。 – Andreas
あまりにも多くの拡張子を付けずにSpark APIを使って同じことをすることができるように思えます。 Scala APIを使用する場合、Javaライブラリをあまり面倒なく使用できます。 'mapPartitions'はパーティション内のエントリを反復することを可能にし、データベース接続などのような高価な設定を持つものに使用されることになっています。 – LiMuBei