Spark(PySpark)如何同步多个worker节点更新RDD
Posted
技术标签:
【中文标题】Spark(PySpark)如何同步多个worker节点更新RDD【英文标题】:Spark(PySpark) how to synchronize multiple worker nodes updating RDD 【发布时间】:2016-02-26 14:54:06 【问题描述】:我有三个矩阵(A、B 和 C)作为单独的 RDD,我需要将它们划分为工作节点,作为矩阵块。我执行的操作需要更新矩阵块,但我需要在矩阵块上同步,以便两个工作节点不会同时更新同一个矩阵块。我怎样才能实现这种同步。有锁定机制吗?我对 Spark (PySpark) 很陌生。
是否可以控制 Spark 进行分区的方式,即控制将哪个块发送到哪个工作节点?
请帮忙。
【问题讨论】:
【参考方案1】:从技术上讲,这完全没有关系。 Spark 中不存在共享的、可变的状态(有人可能会争辩说accumulators
就是这种情况,但不要纠缠于此)。这意味着不存在计算可以修改共享状态并且需要任何类型的锁的情况。
这在 JVM 上稍微复杂一些,但 PySpark 架构提供了工作人员之间的完全隔离,所以除非你走出 Spark 的保险箱。如果您这样做,您有责任使用特定于上下文的方法处理冲突。
最后,如果您尝试修改数据(请不要将其与 RDD 混合),这只是一个编程错误。它可能会在 JVM 上导致一些非常丑陋的事情,但对 PySpark 应该再一次没有明显的影响(这只是实现问题而不是合同问题)。每个更改都应使用转换来表示,并且只要未另行指定(参见例如 fold
或 aggregate
系列),不应修改现有数据。
【讨论】:
所以基本上你是说 RDD 是不可变的,我们只是从另一个 RDD 创建一个 RDD。如果我错了,请纠正我。但是然后说我必须计算矩阵A的第i个块,这是计算第j个和第k个矩阵B和C块的结果,以及计算第m个和第n个矩阵B块和C,但我需要确保这两个计算是一个接一个地完成,而不是一次完成。我该怎么做。 RDD 是完全不同的故事,但简化了一点是的。计算 A。创建依赖于 A 的新转换并计算 B 和 C。以上是关于Spark(PySpark)如何同步多个worker节点更新RDD的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件
使用 pyspark,如何将文件中单行的多个 JSON 文档读入数据框?
如何在字典中使用 pyspark.sql.functions.when() 的多个条件?