我有一个DataSet.map
操作,需要从外部REST API中提取数据。
REST API客户端返回Future[Int]
。
是否有可能让DataSet.map
操作以某种方式等待此Future
异步?或者我需要使用Await.result
来阻止线程吗?或者这不是完成的事情......即我应该尝试将API持有的数据加载到自己的DataSet
中,然后执行join
?
提前致谢!
修改
与:Spark job with Async HTTP call
不同原因:此问题可以讨论如何以不同的方式解决问题,例如,使用第二个DataSet
和join
。此外,关于Spark是否可以处理异步转换 - 以及是否可以 - 如何构建它们的链接问题没有明确的答案。
答案 0 :(得分:2)
这是一个有趣的问题(我不认为是另一个问题的重复)。
是的,您可以提交Spark作业,也就是说Spark作业将以异步方式执行(让主调用线程在调用后可以自由地执行任何操作)。这是SparkContext.submitJob。
是的,您可以使用相同的SparkContext
从多个线程同时运行Spark作业,即SparkContext
是线程安全的。
给定两个选项,您可以拥有一个线程池(使用java.util.concurrent.Executors)并执行Spark作业,然后执行异步操作,例如“从返回的外部REST API中提取数据未来[INT]。“
现在,这部分与Spark无关。您希望如何获得有关Future[Int]
结果的通知取决于您。您可以Await
或仅注册回调,以便在Success
或Failure
发生时进行调用。这取决于你,与Spark没有任何关系。
重要的是你将如何提交或运行Spark工作,因为map
单独不会这样做。 map
是一种转变。我宁可使用foreachPartition
代替外部呼叫。