3、Spark会使用谱系图来记录这些不同RDD之间的依赖关系,Spark需要用这些信息来按需计算每一个RDD,也能够依托谱系图在持久化的RDD丢失部份数据时用来恢复所丢失的数据。(以下图,过滤errorsRDD与warningsRDD,终究调用union函数)
窄依赖 (narrowdependencies) 和宽依赖 (widedependencies) 。窄依赖是指 父 RDD 的每一个分区都只被子 RDD 的1个分区所使用 。相应的,那末宽依赖就是指父 RDD 的分区被多个子 RDD 的分区所依赖。例如, map 就是1种窄依赖,而 join 则会致使宽依赖
这类划分有两个用途。首先,窄依赖支持在1个结点上管道化履行。例如基于1对1的关系,可以在 filter 以后履行 map 。其次,窄依赖支持更高效的故障还原。由于对窄依赖,只有丢失的父 RDD 的分区需要重新计算。而对宽依赖,1个结点的故障可能致使来自所有父 RDD 的分区丢失,因此就需要完全重新履行。因此对宽依赖,Spark 会在持有各个父分区的结点上,将中间数据持久化来简化故障还原,就像 MapReduce 会持久化 map 的输出1样。
RDD工作原理:
RDD(Resilient DistributedDatasets)[1] ,弹性散布式数据集,是散布式内存的1个抽象概念,RDD提供了1种高度受限的同享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD履行肯定的转换操作(如map、join和group by)而创建,但是这些限制使得实现容错的开消很低。对开发者而言,RDD可以看做是Spark的1个对象,它本身运行于内存中,如读文件是1个RDD,对文件计算是1个RDD,结果集也是1个RDD,不同的分片、数据之间的依赖、key-value类型的map数据都可以看作RDD。
主要分为3部份:创建RDD对象,DAG调度器创建履行计划,Task调度器分配任务并调度Worker开始运行。
SparkContext(RDD相干操作)→通过(提交作业)→(遍历RDD拆分stage→生成作业)DAGScheduler→通过(提交任务集)→任务调度管理(TaskScheduler)→通过(依照资源获得任务)→任务调度管理(TaskSetManager)
Transformation返回值还是1个RDD。它使用了链式调用的设计模式,对1个RDD进行计算后,变换成另外1个RDD,然后这个RDD又可以进行另外1次转换。这个进程是散布式的。
Action返回值不是1个RDD。它要末是1个Scala的普通集合,要末是1个值,要末是空,终究或返回到Driver程序,或把RDD写入到文件系统中
转换(Transformations)(如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从1个RDD转换生成另外一个RDD的操作不是马上履行,Spark在遇到Transformations操作时只会记录需要这样的操作,其实不会去履行,需要等到有Actions操作的时候才会真正启动计算进程进行计算。
操作(Actions)(如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。
它们本质区分是:Transformation返回值还是1个RDD。它使用了链式调用的设计模式,对1个RDD进行计算后,变换成另外1个RDD,然后这个RDD又可以进行另外1次转换。这个进程是散布式的。Action返回值不是1个RDD。它要末是1个Scala的普通集合,要末是1个值,要末是空,终究或返回到Driver程序,或把RDD写入到文件系统中。关于这两个动作,在Spark开发指南中会有就进1步的详细介绍,它们是基于Spark开发的核心。
参考:http://www.itshipin.com/article/article110.html
上一篇 [Java]ITOO初步了解