一篇文章看懂 Spark RDD
RDD 的五大特性:
先记住这五个特性,之后的学习会慢慢体会到这样设计的好处。下面是理解 RDD 的逻辑图; 看这个图再回头理解一下上面的五个 RDD 的特性。 RDD 的弹性表现在 Partition 的数量上,并且大小没有限制。RDD 的依赖关系,可以基于上一个 RDD 计算出下一个 RDD。RDD 的每个 partition 是分布在不同数据节点上的,所有 RDD 的分布式的。RDD 提供了一些列的最佳的计算位置,体现了数据的本地化,我之前的这篇文章写过:一文搞懂数据本地化级别 RDD 还有一个 Lineage 的东西,叫做血统。 Lineage 简介:利用内存加快数据加载,在其它的In-Memory类数据库或Cache类系统中也有实现。Spark的主要区别在于它采用血统来实现分布式运算环境下的数据容错性(节点失效、数据丢失)问题。 RDD Lineage被称为RDD运算图或RDD依赖关系图,是RDD所有父RDD的图。它是在RDD上执行transformations函数并创建逻辑执行计划(logical execution plan)的结果,是RDD的逻辑执行计划。 相比其它系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD 的 Lineage 记录的是粗颗粒度的特定数据转换(Transformation)操作(filter, map, join etc.)行为。当这个 RDD 的部分分区数据丢失时,它可以通过Lineage找到丢失的父RDD的分区进行局部计算来恢复丢失的数据,这样可以节省资源提高运行效率。这种粗颗粒的数据模型,限制了Spark的运用场合,但同时相比细颗粒度的数据模型,也带来了性能的提升。 4 控制算子 控制算子有三种:cache, persist, checkpoint, 以上算子都可以将 RDD 持久化、持久化的单位是 Partition。 cache 和 persist 都是懒执行的,必须有一个 action 算子来触发他们执行。checkpoint 不仅可以将 RDD 持久化到磁盘,还能切断 RDD 之间的依赖关系。 说几点区别:
checkpoint 的执行原理是:当 RDD 的 job 执行完毕之后,会从 finalRDD 进行回溯。当回溯到某一个 RDD 调用了 checkpoint 方法,会对当前的 RDD 做一个标记。Spark 框架会自动启动一个新的 Job ,重新计算这个 RDD 的数据,将数据持久化到 HDFS 上。根据这个原理,我们可以进行优化,对 RDD 进行 checkpoint 之前,最好先对这个 RDD 进行 cache, 这样启动新的 job 只需要将内存中的数据拷贝到 HDFS 上就可以了,节省了重新计算这一步。 5 RDD 的依赖关系 窄依赖:指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter/union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。窄依赖不会产生 shuffle。 宽依赖:指子RDD的分区依赖于父RDD的所有分区,这是因为 shuffle 类操作,如图中的 groupByKey 和未经协同划分的 join。 遇到宽依赖会产生 shuffle 。 上面我们说到了 RDD 之间的依赖关系,这些依赖关系形成了一个人 DAG 有向无环图。DAG 创建完成之后,会被提交给 DAGScheduler, 它负责把 DAG 划分相互依赖的多个 stage ,划分依据就是 RDD 之间的窄宽依赖。换句话说就是,遇到一个宽依赖就划分一个 stage,每一个 stage 包含一个或多个 stask 任务。然后将这些 task 以 taskset 的方式提交给 TaskScheduler 运行。也可以说 stage 是由一组并行的 task 组成。下图很清楚的描述了 stage 的划分。 6 Stage划分思路 接上图,Spark 划分 stage 的整体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个 RDD 加入该 stage 中。 因此在图中 RDD C, RDD D, RDD E, RDD F 被构建在一个 stage 中, RDD A被构建在一个单独的Stage中,而 RDD B 和 RDD G 又被构建在同一个 stage中。 另一个角度 一个 Job 会被拆分为多组 Task,每组任务被称为一个Stage就像 Map Stage,Reduce Stage。 (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |