我有一个是这样的火花驱动程序:星火缓存策略
编辑 - 代码的早期版本不同&没有工作
var totalResult = ... // RDD[(key, value)]
var stageResult = totalResult
do {
stageResult = stageResult.flatMap(
// Some code that returns zero or more outputs per input,
// and updates `acc` to number of outputs
...
).reduceByKey((x, y) => x.sum(y))
totalResult = totalResult.union(stageResult)
} while(stageResult.count() > 0)
我从我的数据的性质认识这将最终终止(我本质上聚合了一个DAG中的节点)。
我不确定合理的缓存策略 - 我应该每次缓存stageResult
循环吗?我是否设置了一个可怕的递归塔,因为每个totalResult
都取决于它自己以前的所有化身?或者Spark会为我指出这一点?或者我应该将每个RDD结果放在一个数组中,并在最后采取一个大的联合?
建议在这里受欢迎,谢谢。
首先,蓄电池,当谈到转型是不可靠的。 –
为什么不呢?我只是创建一个累加器并在地图中使用它,然后在驱动程序中检查它。 –
在这种情况下理论上它可能在这里工作,但由于机器故障和可能的重新计数,计数本身并不可靠。但是,既然你只关心它是否为零,那么它可能会适合你。另一个说明,但。如果这是你的最终代码,那么这将不会发生任何事情。有没有行动正在运行,所以计算(因此累加器将永远不会触发) –