2016-06-16 20 views
2

スパークストリーミングで複数のアクションを非同期/並列実行する方法はありますか?ここで が私のコードです:スパークストリーミングで複数のアクションを並列/非同期で実行

positions.foreachRDD(rdd -> { 

      JavaRDD<A> pbv = rdd.map(p -> A.create(p));   
      javaFunctions(pbv).writerBuilder("poc", "table_a", mapToRow(A.class)).saveToCassandra();  

      JavaRDD<D> pbd = rdd.map(p -> D.create(p));   
      javaFunctions(pbd).writerBuilder("poc", "table_d", mapToRow(D.class)).saveToCassandra();    

      JavaRDD<L> pblv = rdd.map(p -> L.create(p));   
      javaFunctions(pblv).writerBuilder("poc", "table_l", mapToRow(L.class)).saveToCassandra();    

      JavaRDD<V> pbld = rdd.map(p -> V.create(p));   
      javaFunctions(pbld).writerBuilder("poc", "table_v", mapToRow(V.class)).saveToCassandra(); 

    }); 

私は並列にsaveToCassandraアクションをやりたい、これは「テクニクスの火付け役」または唯一の自作スレッド/実行者扱い経由で可能ですか?

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

よろしく、 マルクス

+1

これらの挿入を実行する最も速い方法は 'rdd.foreachPartition'を実行し、javaドライバを使用して' PreparedStatements'を作成し、 'session.executeAsync'で提出することです。 – maasg

+0

Thxヒント。あなたのアプローチをテストしようとします。 @RussSからのdstreamアプローチが機能しなかった場合 – mananana

答えて

1

massgさんのコメント@は、おそらくフォークのこの種への最速の方法ですが、あなたは、あなたがより簡単にちょうどストリームを分割することにより、これを行うことができることをしたくない場合。

すべてのこれらの要求が並行して起こりますDSTREAMに作用することにより、

positions.map(A.create(p)).saveToCassandra 
positions.map(D.create(p)).saveToCassandra 
positions.map(L.create(p)).saveToCassandra 
positions.map(V.create(p)).saveToCassandra 

ような何か。

+0

これらのジョブはすべて同じ依存関係を持つ必要がありますので、同時に実行する必要があります。十分な数のコアがない場合は、すべての計算リソースが必要です。 – RussS

+0

デフォルトのFIFOスケジューラを使用すると、出力が1つずつ実行されます。 保存する前にRDDの位置をキャッシュする場合(おそらくRDDの計算が複雑なため)、最初の出力が出力を計算し、残りの3つの出力が保存されたキャッシュを保存するだけなので、 – mniehoff

関連する問題