如果当我遍历 RDD 时,我需要通过调用外部(阻塞)服务来计算数据集中的值怎么办?您认为如何才能实现这一目标?
值:Future[RDD[Double]] = Future sequence tasks
我尝试创建一个 Futures 列表,但由于 RDD id 不可遍历,Future.sequence 不适合。
我只是想知道,如果有人遇到这样的问题,你是如何解决的?
我想要实现的是在单个工作节点上获得并行性,这样我就可以调用该外部服务3000次/次second.
可能还有另一种解决方案,更适合 Spark,例如在单个主机上拥有多个工作节点。
有趣的是,你如何应对这样的挑战?谢谢。
这是我自己的问题的答案:
val buckets = sc.textFile(logFile, 100)
val tasks: RDD[Future[Object]] = buckets map { item =>
future {
// call native code
}
}
val values = tasks.mapPartitions[Object] { f: Iterator[Future[Object]] =>
val searchFuture: Future[Iterator[Object]] = Future sequence f
Await result (searchFuture, JOB_TIMEOUT)
}
这里的想法是,我们获得分区的集合,其中每个分区都被发送到特定的工作人员,并且是最小的工作。每一项工作都包含数据,可以通过调用本机代码并发送该数据来处理这些数据。
“values”集合包含从本机代码返回的数据,并且该工作是在整个集群中完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)