懒惰的评估和死锁

时间:2017-10-14 15:52:24

标签: scala apache-spark concurrency deadlock lazy-evaluation

最近我决定试一试并开始阅读劳尔埃斯特拉达的书“带有SMACK堆栈的快速数据处理系统”。在第2章之后,我认为除非我遇到过“hello worlds”,否则编译不是那么糟糕:

  

正如我们所看到的,懒惰的评估还可以防止死锁和瓶颈,因为它可以防止死机   进程无限期地等待另一个进程的结果。

我惊讶地发现并试图找到任何关于懒惰评估可以防止死锁的说法。该声明涉及Scala和Spark。不幸的是我没有发现任何争论。据我所知,为了避免僵局,你必须确保其中至少有一个永远不会发生:

  • 互相排斥
  • 锁定&等等
  • 没有先发制人
  • 循环等待

懒惰评估如何阻止他们中的任何一个?

2 个答案:

答案 0 :(得分:2)

懒惰评估本身并不能防止死锁,但它与另一个概念密切相关,即计算图。由于Spark将计算描述为依赖的谱系,因此它可以验证计算图是非循环的(着名的DAG),因此没有可能导致循环等待的情况。

在高级别Spark通过禁止嵌套转换和操作来强制执行此操作,这意味着阶段之间没有隐藏的依赖关系。

答案 1 :(得分:1)

Spark的核心数据结构,即RDD是不可变的,作为Java中的String对象。每次对现有RDD进行转换时,都会创建一个新的RDD。这个新的RDD被表示为一个顶点,并且所应用的变换由从父RDD到新的RDD的有向边表示。在惰性评估中,每次我们对现有RDD进行变换时,Spark内核都会向DAG添加新的顶点。 Spark不会立即执行转换,操作调用会触发对RDDs的评估,这是通过执行DAG(该特定RDD的血统,在其上执行操作被称为)。惰性评估使得不可能在RDDs的谱系图中具有定向循环。 Spark驱动程序陷入无限循环的可能性为零。这就是Spark中的惰性评估。 使用DAG的惰性评估实现增加了Spark中查询优化和容错的优势

现在,在防止死锁和防止互斥,锁定和等待,无抢占,循环等待方面,所有这些都与计划任务和正确分配资源有关。我认为这是Spark执行环境的问题。当执行程序在集群管理器的工作节点中执行任务时,Spark驱动程序将对执行程序进行调度。

相关问题