在 Spark 中循环。模拟

Loop in Spark. Simulation

是否可以使用 spark 解决模拟问题? 例如: 我需要模拟一些生物体的出生和死亡过程。停止条件:(population = 0 || population > X) 例如,X 为 1,000,000,000。

是否可以在某种条件下使用循环?如果 "YES" 实现此循环的最佳方法是什么。如果"NO"有没有其他机制提供停止条件?

现在我看到了几个解决这个问题的选项:

要控制停止条件,我可以使用:

  1. 累加器 // 安全吗?
  2. call organismRdd.size // 性能怎么样?

为了模拟过程,我可以使用:

  1. flatMap with organism.nextEpoch() 调用 returns 生物体迭代器
  2. 我可以使用 forEach,但在这种情况下,我需要在 Organism 中实现一些逻辑,以将所有 "child" 节点保留在某个树王中

JAVA 伪代码示例:

Accumulator population = new Accumulator();
JavaRDD<Organism> organismRdd = ...// create RDD
while(population = 0 || population > X)
{
    organismRdd = organismRdd.flatMap(organism -> organism.nextEpoch()) // return next epoch organisms iterator
    // update population accumulator
}

停止条件可以使用rdd.count()。 这实际上是必要的,因为仅调用 flatMap 不会执行任何操作,因为 Spark rdd 转换是延迟计算的。 您还希望在每一步之后 .cache() 您的 rdd 以避免重新计算。

要生成新生物,flatMap是一个不错的选择。 您也可以根据需要使用 mapPartitions