我们有一个有数百万行的大型RDD。每一行都需要使用获得许可的第三方优化器(Gurobi)进行处理。我们有有限的许可证。
我们一直在调用火花.map()函数中的优化器。问题是星火将运行比它需要的更多的映射器,并丢弃结果。这会导致许可证耗尽的问题。
我们将在星火.foreach()方法中调用Gurobi。这是可行的,但我们有两个问题:
.foreach()方法死在的节点上会发生什么?火花保证每个预言只运行一次。它是否检测到它死了并在其他地方重新启动它?还是其他事情发生了?发布于 2018-06-20 16:08:30
通常,如果使用foreachPartition执行的任务死亡,则整个任务将死亡。
这意味着,如果不采取其他步骤来确保正确性,则外部系统可能已经确认了部分结果,从而导致状态不一致。
考虑到有限数量的许可证,map或foreachPartition不应该有任何区别。如果在这种情况下使用Spark是有意义的,最好的解决方法是限制执行器内核的数量,限制您拥有的许可证数量。
https://stackoverflow.com/questions/50951848
复制相似问题