将结果从执行器返回到驱动程序

ny6fqffe  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(416)

我有一个spark应用程序,它基本上接收一个大数据集,对它执行一些计算,最后执行一些io将它存储在数据库中。所有这些阶段都发生在执行器上,驱动程序从每个任务中获取(收集)一个布尔值,表示该任务的成功/失败状态(例如,某些项的计算或io可能失败)。
e、 例如,下面是一个过于简化的沿袭(在实际实现中,有多个重新划分和计算步骤):

readSomeDataset()
  .repartition()
  .mapPartition { // do some calculation }
  .mapPartition { // do some IO }
  .collect()

问题:根据计算结果,我想在驱动程序上做些别的事情(比如发布一条消息说“计算成功了”)。这需要对整个数据集执行一次,而不是对单个分区,因此需要在驱动程序上执行。
但是,executors上的io需要很长时间,我不想等到它完成后再发布。
在处理任务的过程中,执行者是否有办法将“消息”发送回驱动程序?
(不过,我想到了蓄能器之类的东西,因为只有在执行器的最终操作完成后,蓄能器才能使用)

jjhzyzn0

jjhzyzn01#

spark是一个懒惰的框架,需要一个完整的作业(从读到写)来执行,它不能只执行一部分。
要在不重新处理的情况下进行这些更改,可以缓存Dataframe,以尽可能快的速度恢复,类似这样的操作。

val calculatedDF = readSomeDataset()
  .repartition()
  .mapPartition { // do some calculation }
  .cache() // or persist if can't fit in memory of the executors

if (caculatedDF.map(checkEackAreOK).reduce(_ && _).head) { // a condition to see if the calculations are ok and an action to launch it
  println("correct calculation")
  calculatedDF
    .mapPartition { // do some IO }
    .collect()
} else {
  println("incorrect calculation")
}

相关问题