2016-12-02 9 views
2

外部REST APIからデータをプルする必要があるDataSet.map操作があります。マップ/フィルタ/ etcから非同期操作(つまり未来を返す)を実行する方法

REST APIクライアントはFuture[Int]を返します。

DataSet.mapオペレーションをどういうわけか、このFutureを非同期で待機させることはできますか?または、Await.resultを使用してスレッドをブロックする必要がありますか?または、これは単に完了したものではありません。つまり、代わりにAPIによって保持されているデータを自分自身のDataSetに読み込み、joinを実行する必要がありますか?

ありがとうございます!

EDIT:異なり

Spark job with Async HTTP call

理由:この質問は二DataSet、代わりにjoinを使用して、たとえば、異なった問題を解決する方法を議論に開かれています。さらに、リンクされた質問には、Sparkが非同期変換を処理できるかどうか、そして可能であればどのように構造化するべきかについては決定的な答えが含まれていません。

+0

非同期httpコールでスパークジョブを探している人がいる場合のみです。[チェックアウト this](https://stackoverflow.com/a/45946369/150371) – raksja

答えて

1

興味深い質問です(私はもう一つの質問と重複しているとは思わない)。

はい、Sparkジョブは非同期で実行されることになります(メインの呼び出しスレッドは呼び出し後に何でも自由に実行できる)。これはSparkContext.submitJobです。

はい、非常に同じSparkContextを使用して複数のスレッドから同時にスパークジョブを実行できます。つまり、SparkContextはスレッドセーフです。

2つのオプションを指定すると、スレッドプール(java.util.concurrent.Executorsを使用)を実行してSparkジョブを実行し、非同期アクション、たとえば"Future [Int]を返す外部REST APIからデータをプルします。 "

ここで、この部分はスパークとは関係ありません。 Future[Int]の結果を通知する方法はあなた次第です。 Await、またはSuccessまたはFailureが発生したときに呼び出されるコールバックを登録することができます。それはあなた次第であり、スパークとは何の関係もありません。

mapだけではこれが行われないため、スパークジョブを送信または実行する方法は重要です。 mapは変換です。私はむしろ外部呼び出しを行う代わりにforeachPartitionを使用したいと思います。

関連する問題