Apache spark Spark RDD分区之间的同步

Apache spark Spark RDD分区之间的同步,apache-spark,rdd,partition,Apache Spark,Rdd,Partition,假设我有一个包含3个分区的RDD,我想按顺序运行每个执行器/工作器,这样,在计算分区1之后,就可以计算分区2,在计算分区2之后,就可以计算分区3。我之所以需要这种同步,是因为每个分区都依赖于前一个分区的某些计算。如果我错了,请纠正我,但是这种类型的同步似乎不太适合Spark框架 我考虑过在每个worker任务节点中打开JDBC连接,如下所示: rdd.foreachPartition( partition => { // 1. open jdbc connection // 2

假设我有一个包含3个分区的RDD,我想按顺序运行每个执行器/工作器,这样,在计算分区1之后,就可以计算分区2,在计算分区2之后,就可以计算分区3。我之所以需要这种同步,是因为每个分区都依赖于前一个分区的某些计算。如果我错了,请纠正我,但是这种类型的同步似乎不太适合Spark框架

我考虑过在每个worker任务节点中打开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发送了广播变量,您不能重新广播其他值。

同步不是真正的问题。问题是,您希望使用并发层来实现这一点,因此您可以获得完全顺序执行。不用说,仅仅为了在另一个worker上获取这些更改而将更改推送到数据库,这意味着您得不到内存处理的好处。在目前的形式下,使用Spark根本没有意义

一般来说,如果您想在Spark中实现同步,您应该考虑转换。您的问题相当粗略,但您可以尝试以下内容:

  • 使用第一个分区中的数据创建第一个RDD。并行处理,并可选择将结果推送到外部
  • 计算差分缓冲区
  • 使用第二个分区中的数据创建第二个RDD。合并来自2的差分缓冲区,处理,可选地将结果推送到数据库
  • 回到2。重复

  • 你在这里得到了什么?首先,您可以利用整个集群。此外,部分结果保存在内存中,不必在工作人员和数据库之间来回传输。

    Spark用于分布式计算和并行处理。若您需要按顺序处理数据,那个么就不需要Spark。您可以用java或Scala编写作业,从命令行执行作业,也可以使用任何标准的调度程序(cron、Quartz等)对作业进行调度。我之所以要使用Spark,是因为我需要将大量数据放入内存中,以便快速计算。我还想利用Spark的其他特性,例如数据和任务分布以及数据弹性。我还需要实现一定程度的并行性,但在这个看似简单的顺序步骤解决之前,我不想将其引入问题空间。我只需要遍历一个数组,同时比较另一个数组的值。如果有足够的内存,我可以在一台机器上完成这项工作,但我们可以说,我有一组已经启动并运行了Spark的机器。在给定RDD抽象的情况下,在Spark集群中分布20GB阵列非常简单。为了迭代每个数组分区,将代码推送到每个工作进程也同样简单。现在,仅仅因为我需要顺序执行并不意味着Spark没有用处。您可能无法在Spark中顺序处理分区。虽然RDDAPI中有一个
    fold()
    函数,但对于每个分区,它也适用于分布式模型。您需要遵循@zero323的建议,尽管您可以使用一些内存中的分布式缓存解决方案(如couchbase)来存储中间结果。