假设我有一个带有3个分区的RDD,并且我希望按顺序运行每个执行程序/工作程序,这样,在计算分区1之后,可以计算分区2,最后计算2之后,可以计算分区3。我需要这种同步的原因是因为每个分区都依赖于前一个分区的某些计算。如果我错了,请纠正我,但这种类型的同步似乎不适合Spark框架。
我考虑在每个工作任务节点中打开JDBC连接,如下所示:
rdd.foreachPartition( partition => {
// 1. open jdbc connection
// 2. poll database for the completion of dependent partition
// 3. read dependent edge case value from computed dependent partition
// 4. compute this partition
// 5. write this edge case result to database
// 6. close connection
})
我甚至考虑使用累加器,在驱动程序中选择acc值,然后重新广播一个值,以便适当的工作人员可以开始计算,但显然广播并不像这样工作,即,一旦你通过foreachPartition发送了广播变量,你无法重新广播不同的值。
答案 0 :(得分:0)
同步不是真正的问题。问题是你想使用并发层来实现这一点,因此你可以完全顺序执行。更不用说通过将更改推送到数据库只是为了在另一个工作程序上获取它们意味着你没有得到内存处理的好处。在目前的形式中,根本不使用Spark是没有意义的。
一般来说,如果你想在Spark中实现同步,你应该考虑转换。你的问题相当粗略,但你可以尝试这样的事情:
你在这里获得了什么?首先,您可以利用整个集群。此外,部分结果保存在记忆中,不必在工人和数据库之间来回传递。