我们有一个具有数百万行的大型RDD。每行都需要使用获得许可的第三方优化器(Gurobi)进行处理。我们的许可证数量有限。
我们一直在Spark .map()
函数中调用优化器。问题在于,Spark将运行比所需数量更多的映射器,并丢弃结果。这会导致许可证用尽的问题。
我们正在考虑在Spark .foreach()
方法内调用Gurobi。这可行,但是我们有两个问题:
将数据从优化器返回到另一个RDD。我们为此的暂定计划是将结果写入数据库(例如MongoDB或DynamoDB)。
如果.foreach()
方法所在的节点死亡,该怎么办? Spark保证每个foreach仅运行一次。它是否检测到它死了并在其他地方重新启动?还是会发生其他事情?
答案 0 :(得分:1)
通常,如果用foreachPartition
执行的任务死亡而整个工作死亡。
这意味着,如果不采取其他措施来确保正确性,则外部系统可能已经确认了部分结果,从而导致状态不一致。
考虑有限数量的许可证map
或foreachPartition
不会有任何区别。在这种情况下使用Spark是否有意义没有讨论,解决它的最佳方法是将执行者核心的数量限制为您拥有的许可证数量。
答案 1 :(得分:0)
如果这里的目标是限制X个并发调用的数量,那么我将用x重新划分RDD,然后运行分区级别的操作。我认为这可以避免您耗尽许可证。