文章目录
Lineage简介
依赖的类型
什么是宽依赖
什么是窄依赖
容错原理数据库
利用内存加快数据加载,在其它的In-Memory类数据库或Cache类系统中也有实现。Spark的主要区别在于它采用血统(Lineage)来时实现分布式运算环境下的数据容错性(节点失效、数据丢失)问题。RDD Lineage被称为RDD运算图或RDD依赖关系图,是RDD全部父RDD的图。它是在RDD上执行transformations函数并建立逻辑执行计划(logical execution plan)的结果,是RDD的逻辑执行计划。相比其它系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据转换(Transformation)操做(filter, map, join etc.)行为。当这个RDD的部分分区数据丢失时,它能够经过Lineage找到丢失的父RDD的分区进行局部计算来恢复丢失的数据,这样能够节省资源提升运行效率。这种粗颗粒的数据模型,限制了Spark的运用场合,但同时相比细颗粒度的数据模型,也带来了性能的提高。分布式
依赖关系决定Lineage的复杂程度,同时也是的RDD具备了容错性。由于当某一个分区里的数据丢失了,Spark程序会根据依赖关系进行局部计算来恢复丢失的数据。依赖的关系主要分为2种,分别是 宽依赖(Wide Dependencies)和窄依赖(Narrow Dependencies)。ide
宽依赖:是指子RDD的分区依赖于父RDD的多个分区或全部分区,也就是说存在一个父RDD的一个分区对应一个子RDD的多个分区。函数
窄依赖:是指父RDD的每个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD的多个分区。性能
判断依赖的本质:判断是宽依赖仍是窄依赖的本质其实是根据父RDD的分区和对应的子RDD的分区来进行区分宽依赖和窄依赖的。当父RDD的分区对应多个分区时,也就是说父RDD的分区对应的另外一部分数据多是其余子RDD的数据,那么当该RDD数据丢失后,进行容错从分区就会把该RDD跟另一个RDD的数据都从新计算一遍,这样就会致使冗余计算(由于,另外一个子RDD的数据是当前丢失的子RDD所不须要的也计算了一遍)。spa
对于 Shuffle Dependencies(通常是宽依赖),Stage 计算的输入和输出在不一样的节点上,输入节点的Lineage无缺,而输出节点死机的状况,经过从新计算恢复数据这种状况下,这种方法容错是有效的,不然无效,由于没法重试,须要向上追溯其祖先看是否能够重试(这就是 lineage,血统的意思),窄依赖对于数据的重算开销要远小于 宽依赖的数据重算开 销。.net
窄依赖( Narrow Dependency) 和 Shuffle Dependency 的概念主要用在两个地方:一个是容错中至关于 Redo 日志的功能;另外一个是在调度中构建 DAG 做为不一样 Stage 的划分点。3d
宽依赖和窄依赖如图所示日志
在Spark的容错机制中,当一个节点宕机了,进行容错恢复时,对于窄依赖来说,进行重计算时只要把丢失的父RDD分区重算便可,不依赖于其余节点。而对于Shuffle Dependency来讲,进行重计算时须要父RDD的分区都存在,这样计算量就太大了比较耗费性能。orm
以下图所示,若是 RDD_1 中的 Partition3 出错丢失,图1.1 Spark 会回溯到 Partition3 的父分区 RDD_0 的 Partition3,图1.2则会回溯到父分区RDD_0的Partition0和Partition3,对 RDD_0 的 Partition3 重算算子,获得 RDD_1 的 Partition3。其余分区丢失也是同理重算进行容错恢复。
若是 RDD_1 中的 Partition3 丢失出错,因为其父分区是 RDD_0 的全部分区,因此须要回溯到 RDD_0,重算 RDD_0 的全部分区,而后将 RDD_1 的 Partition3 须要的数据汇集合并为 RDD_1 的 Partition3。在这个过程当中,因为 RDD_0 中不是 RDD_1 中 Partition3 须要的数据也所有进行了重算,因此产生了大量冗余数据重算的开销。
同时在RDD计算,也经过checkpoint进行容错,作checkpoint有两种方式,一个是checkpoint data,一个是logging the updates。用户能够控制采用哪一种方式来实现容错,默认是logging the updates方式,经过记录跟踪全部生成RDD的转换(transformations)也就是记录每一个RDD的lineage(血统)来从新计算生成丢失的分区数据。可是,在使用checkpoint算子来作检查点,不只须要考虑Lineage长度,还也要考虑Lineage的复杂度(是否有宽依赖),对于Shuffle Dependency加Checkpoint是一个值得提倡的作法。
参考: https://blog.csdn.net/u013063153/article/details/73865123