如何从map / filter / etc执行异步操作(即返回Future)?

时间:2016-12-02 12:28:31

标签: scala apache-spark apache-spark-sql spark-streaming

我有一个DataSet.map操作,需要从外部REST API中提取数据。

REST API客户端返回Future[Int]

是否有可能让DataSet.map操作以某种方式等待此Future异步?或者我需要使用Await.result来阻止线程吗?或者这不是完成的事情......即我应该尝试将API持有的数据加载到自己的DataSet中,然后执行join

提前致谢!

修改

与:Spark job with Async HTTP call

不同

原因:此问题可以讨论如何以不同的方式解决问题,例如,使用第二个DataSetjoin。此外,关于Spark是否可以处理异步转换 - 以及是否可以 - 如何构建它们的链接问题没有明确的答案。

1 个答案:

答案 0 :(得分:2)

这是一个有趣的问题(我不认为是另一个问题的重复)。

是的,您可以提交Spark作业,也就是说Spark作业将以异步方式执行(让主调用线程在调用后可以自由地执行任何操作)。这是SparkContext.submitJob

是的,您可以使用相同的SparkContext从多个线程同时运行Spark作业,即SparkContext是线程安全的。

给定两个选项,您可以拥有一个线程池(使用java.util.concurrent.Executors)并执行Spark作业,然后执行异步操作,例如“从返回的外部REST API中提取数据未来[INT]。“

现在,这部分与Spark无关。您希望如何获得有关Future[Int]结果的通知取决于您。您可以Await或仅注册回调,以便在SuccessFailure发生时进行调用。这取决于你,与Spark没有任何关系。

重要的是你将如何提交或运行Spark工作,因为map单独不会这样做。 map是一种转变。我宁可使用foreachPartition代替外部呼叫。