2016-12-02 63 views
2

我有一个DataSet.map操作,需要从外部REST API中提取数据。如何从map/filter/etc执行异步操作(即返回Future)?

REST API客户端返回Future[Int]

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

在此先感谢!

编辑:

不同的:Spark job with Async HTTP call

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

+0

以防万一,如果有任何人寻找异步http调用spark工作.. [结帐 这(])(https://stackoverflow.com/a/45946369/150371) – raksja

回答

1

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

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

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

考虑到这两种选择,您可以拥有一个线程池(使用java.util.concurrent.Executors)并执行Spark作业,然后执行异步操作,例如“从返回Future [Int]的外部REST API中提取数据。 “

现在,这部分与Spark无关。您想如何获得关于Future[Int]的结果的通知取决于您。您可以Await或只需注册一个回叫,以在SuccessFailure发生时得到呼叫。这取决于你,与Spark无关。

重要的是你如何提交或运行Spark作业,因为map本身不会这样做。 map是一个转型。我宁愿使用foreachPartition而不是外部电话。