Spark如何从故障节点恢复数据?

Kay*_*ayV 4 failover apache-spark spark-streaming rdd

假设我们有一个 RDD,它被多次使用。因此,为了一次又一次地保存计算,我们使用 rdd.persist() 方法持久化了这个 RDD。

所以当我们持久化这个 RDD 时,计算 RDD 的节点将存储它们的分区。

那么现在假设,包含这个 RDD 持久分区的节点失败了,那么会发生什么?Spark 如何恢复丢失的数据?有没有复制机制?还是其他什么机制?

Avi*_*rya 5

当您执行 rdd.persist 时,rdd 不会具体化内容。它会在您对 rdd 执行操作时执行。它遵循相同的惰性求值原则。

现在,RDD 知道它应该在哪个分区上运行以及与之关联的 DAG。使用 DAG,它完全能够重新创建物化分区。

因此,当一个节点出现故障时,驱动程序会在其他某个节点中生成另一个执行程序,并为它提供它应该在其上工作的数据分区以及在闭包中与其关联的 DAG。现在有了这些信息,它可以重新计算数据并将其具体化。

同时,RDD 中缓存的数据不会在内存中包含所有数据,它必须从磁盘获取丢失节点的数据将花费更多时间。

在复制方面,是的 spark 支持内存复制。持久化时需要设置 StorageLevel.MEMORY_DISK_2 。

rdd.persist(StorageLevel.MEMORY_DISK_2)
Run Code Online (Sandbox Code Playgroud)

这确保数据被复制两次。