代码之家  ›  专栏  ›  技术社区  ›  vy32

如果运行.foreach()的节点失败,spark会做什么?

  •  0
  • vy32  · 技术社区  · 6 年前

    我们有一个有数百万行的大型RDD。每一行都需要使用许可的第三方优化器(Gurobi)进行处理。我们的许可证数量有限。

    我们一直在调用Spark中的优化器 .map() 功能。问题是Spark运行的映射器比它需要的要多,并且会丢弃结果。这会导致许可证耗尽问题。

    我们想打电话给火花里的古洛比 .foreach() 方法。这是可行的,但我们有两个问题:

    1. 将数据从优化器返回到另一个RDD中。我们对此的初步计划是将结果写入数据库(例如MongoDB或DynaModb)。

    2. 如果节点上的 .foreach()。 方法模具?Spark保证每个foreach只运行一次。它是否检测到它死了并在其他地方重新启动?或者发生了什么事?

    2 回复  |  直到 6 年前
        1
  •  1
  •   user9968598    6 年前

    一般来说,如果任务是用 foreachPartition 死了一整份工作。

    这意味着,如果不采取额外的步骤来确保正确性,部分结果可能已被外部系统确认,从而导致状态不一致。

    考虑到许可证数量有限 map foreach分区 不应该有什么区别。如果在这种情况下使用spark有任何意义,那么就不必进行讨论,最好的解决方法是将执行器核心的数量限制在您拥有的许可证数量之内。

        2
  •  0
  •   webber    6 年前

    如果这里的目标是只限制x个并发调用,我将用x重新分区RDD,然后运行分区级别的操作。我认为这应该能防止你耗尽执照。