在 Spark 中循环。模拟
Loop in Spark. Simulation
是否可以使用 spark 解决模拟问题?
例如:
我需要模拟一些生物体的出生和死亡过程。停止条件:(population = 0 || population > X) 例如,X 为 1,000,000,000。
是否可以在某种条件下使用循环?如果 "YES" 实现此循环的最佳方法是什么。如果"NO"有没有其他机制提供停止条件?
现在我看到了几个解决这个问题的选项:
要控制停止条件,我可以使用:
- 累加器 // 安全吗?
- call organismRdd.size // 性能怎么样?
为了模拟过程,我可以使用:
- flatMap with organism.nextEpoch() 调用 returns 生物体迭代器
- 我可以使用 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
。
是否可以使用 spark 解决模拟问题? 例如: 我需要模拟一些生物体的出生和死亡过程。停止条件:(population = 0 || population > X) 例如,X 为 1,000,000,000。
是否可以在某种条件下使用循环?如果 "YES" 实现此循环的最佳方法是什么。如果"NO"有没有其他机制提供停止条件?
现在我看到了几个解决这个问题的选项:
要控制停止条件,我可以使用:
- 累加器 // 安全吗?
- call organismRdd.size // 性能怎么样?
为了模拟过程,我可以使用:
- flatMap with organism.nextEpoch() 调用 returns 生物体迭代器
- 我可以使用 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
。