RDD的运行原理

RDD的运行原理

0.前言

01,许多迭代式算法(机器学习,图算法)和交互式数据 (挖掘工具) 不同的计算阶段之间会重用中间结果
02,目前的MapReduce框架都是把中间结果写入到HDFS中,带来大量的数据复制,磁盘IO和序列化开销

RDD就是为了满足上述的问题而设计的,提供了一个抽象的数据结构
01.不必担心底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列转换处理
02.不同的RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间的数据的存储

03.针对整个RDD进行操作转换,而不是针对某个数据项细粒度修改(不适合网页爬虫)
04.部分功能是无法实现的,但是功能依然强大

2.RDD的执行过程

01.读入外部数据源,(常见的如HDFS),
02.RDD经过一系列的转换操作,每一次都会产生不同的RDD提供给下一个转换操作使用
03.只有一个动作操作,但是可以有很多的转换操作(只做轨迹记录),采取的是lazy机制,
一系列处理称为一个Lineage(血缘关系),即DAG拓扑排序
优点:惰性调用,管道化,避免同步等待,不需要保存中间结果,每次操作变得简单

3.RDD的特性

实现对一个分布式系统进行容错的两种方式:检查点,日志。
检查点的机制代价高昂;
日志:系统的操作用日志记录,—-》细粒度的修改导致日志文件巨大
01,提供高效的容错性:血缘关系【从父节点再次读取数据】只记录粗粒度的操作。
02,存放的数据是Java对象,避免了不必要的对象序列化和反序列化

4.RDD的依赖关系和运行过程

窄依赖:一个或多个父RDD分区对应一个子RDD分区
宽依赖:一个父RDD分区对应一个子RDD的多个分区
shuffle操作可能会得到这个宽依赖
宽依赖恢复分区很困难

5.怎么把一个DAG图拆分成Stage?

1.具体划分方法:
01.在DAG中进行反向解析,遇到宽依赖就断开
02.遇到窄依赖就把当前的RDD加入到Stage中
03.将窄依赖尽量划分到同一个stage中,可以实现流水线作业

DAGScheduler负责把DAG图分解成多个Stage,每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行
SparkContext负责计算RDD之间的依赖关系,构建DAG

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/81197396
今日推荐