2016-09-05 7 views
0

同じワーカーのエグゼキュータの間で共有オブジェクトを使用できますか?スパークと巨大な共有オブジェクト

たとえば、ファイルにデータがあります。このデータは、使用する前にコンパイルする必要があります。コンパイル後、それは直列化不可能なJavaオブジェクトです。 しかし、残念なことにコンパイルには多くの時間がかかります。私は各作業者に対して一度コンパイルし、このオブジェクトを作業者のすべての作業に使用したいと考えています。

私はこれをどのように達成することができますか?

ありがとうございました。

答えて

0

ブロードキャスト変数は潜在的な回答ですが、シリアル化可能でない部分は依然として問題になります。別の潜在的な考え方は、mapPartitionsを使用することです。これは、各レコードではなくパーティション上の関数を適用します。

val rdd = sc.textFile(...) 
rdd.repartition(numExecutors).mapPartitions(iter => { 
    val yourObject = new ExpensiveObject() 
    iter.map(records => yourFunction(records, yourObject)) 
    }) 

これにより、エグゼキュータごとにオブジェクトが1回作成され、使用することができます。残念なことに、アプリケーションで複数のパスが必要な場合は、パスごとに再構築する必要があります。

+0

お返事ありがとうございます。私はmapPartitionをすでに使用していますが、デフォルトではcassandraから35パーティションRDDを取得しているので、私はそれが気に入らないのですが、6人しかいません。それは効率的なアプローチではないので、私は6に再パーティションを使用したくないです。今では、mapPartitionを混在させ、いくつかのキャッシュメカニズムで静的メソッドを使用しようとしています。 –