Spark围绕弹性分布式数据集(RDD)的概念展开,RDD是一个可以并行操作的容错的容错集合。但是,我没有找到RDD完成容错的内部机制。有人可以描述这种机制吗?谢谢。
答案 0 :(得分:22)
让我按照我的理解用非常简单的术语解释。
当其中一个处理数据的节点崩溃时,可能会发生群集中的故障。在spark术语中,RDD被分成多个分区,每个节点(称为executors
)在任何时间点都在一个分区上运行。 (从理论上讲,每个执行程序可以分配多个任务,具体取决于分配给作业的核心数量与RDD中存在的分区数量)。
通过操作,实际发生的是在RDD的分区上执行的一系列Scala函数(在Spark术语中称为转换和操作,具体取决于函数是纯函数还是副作用)。这些操作组合在一起,Spark执行引擎将这些操作视为操作的有向非循环图。
现在,如果某个特定节点在操作Z的中间崩溃,操作Z依赖于操作Y,操作Y继续操作。集群管理器(YARN / Mesos)发现该节点已死并尝试分配另一个节点继续处理。通过传入从中创建的Scala闭包,将告知该节点对RDD的特定分区和它必须执行的一系列操作X-> Y-> Z(称为lineage
)进行操作。应用程序代码。现在,新节点可以愉快地继续处理,实际上没有数据丢失。
Spark也使用这种机制来保证exactly-once
处理,但需要注意的是,你可以多次调用你在Spark Action
块中调用数据库所做的任何副作用操作。但是如果您将转换视为从一个RDD到另一个RDD的纯函数映射,那么您可以放心,生成的RDD将只处理源RDD中的元素一次。
Spark中的容错领域非常广泛,需要更大的解释。我希望看到其他人提出有关如何实施这些内容的技术细节等等。感谢您提供了很棒的主题。