最近我决定试一试并开始阅读劳尔埃斯特拉达的书“带有SMACK堆栈的快速数据处理系统”。在第2章之后,我认为除非我遇到过“hello worlds”,否则编译不是那么糟糕:
正如我们所看到的,懒惰的评估还可以防止死锁和瓶颈,因为它可以防止死机 进程无限期地等待另一个进程的结果。
我惊讶地发现并试图找到任何关于懒惰评估可以防止死锁的说法。该声明涉及Scala和Spark。不幸的是我没有发现任何争论。据我所知,为了避免僵局,你必须确保其中至少有一个永远不会发生:
懒惰评估如何阻止他们中的任何一个?
答案 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驱动程序将对执行程序进行调度。