惰性求值和死锁问题

3
最近我决定尝试阅读Raul Estrada的书籍《使用SMACK堆栈进行快速数据处理系统》。在前两章之后,我认为除了一些“hello world”之外,并没有太多有用的内容,直到我遇到了这个问题:
“正如我们所看到的,惰性求值还可以防止死锁和瓶颈,因为它可以防止一个进程无限期地等待另一个进程的结果。”
我被这个说法惊呆了,试图找到任何支持惰性求值可以预防死锁的论据。这个说法是关于Scala和Spark的。不幸的是,我没有找到任何证据。据我所知,为了避免死锁,您必须确保以下至少发生其中之一:
1. 互斥 2. 锁和等待 3. 无抢占 4. 循环等待
那么惰性求值如何可以防止其中的任何一个呢?
2个回答

2
Lazy evaluation本身并不能防止死锁,但它与另一个概念——计算图紧密相关。由于Spark将计算描述为依赖的谱系,因此它可以验证计算图是无环的(著名的DAG),因此不会出现可能导致循环等待的情况。
在高级别上,Spark通过禁止嵌套转换和操作来执行此操作,这意味着各个阶段之间没有隐藏的依赖关系。

1
Spark的核心数据结构是不可变的,即Java中的String对象,称为RDD。每次在现有的RDD上应用转换时,都会创建一个新的RDD。这个新的RDD被表示为一个顶点,应用的转换由从父RDD到新RDD的有向边表示。在Lazy Evaluation Spark核心中,每当我们在现有的RDD上应用转换时,就会向DAG添加一个新的顶点。Spark不会立即执行转换,而是通过执行DAG(特定RDD的血统)来触发RDD的评估,这是通过调用操作来完成的。懒惰评估使得在RDD的血统图中不存在有向循环成为可能。因此,Spark驱动程序陷入无限循环的可能性为零。这就是Spark中的懒惰评估。使用DAG实现的懒惰评估为Spark提供了查询优化和容错的好处。
现在,当涉及到死锁预防和互斥预防、锁定和等待、无抢占、循环等待时,这都是关于适当调度任务和分配资源的问题。我认为这是Spark执行环境的一个问题。Spark Driver会安排执行器进程的调度,因为它们在集群管理器的工作节点上执行任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接