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