开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:深入 RDD_定义_RDD 的特点】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11962
深入 RDD_定义_RDD 的特点
内容介绍:
一、惰性求值
二、RDD 可分区。
三、RDD 是只读的
四、RDD 可容错
一、惰性求值
通过对 rdd 特点的了解呢,对 rdd 整个的运算过程会有更清晰的认识,有助于以后写代码,理解r dd 的原理,去了解一下 rdd 的特点,rdd 第一个特点,也是非常重要的一个特点,就是 rdd 虽然叫做弹性分布式数据集,但是他不仅是数据集,也是一种编程模型。
甚至这个数据集有一个特点,就是它可能根本就没有保存数据,他和之前的一个大集合里面存了一堆数据是不太一样,它主要偏向于的是计算,所以rdd不仅是数据集还是一个编程模型。与 scala 做一个对比之后会发现,如下图:
Scala
source.flatMap(_.split("
.map((_,1))
groupBy(_._1)
.map(t => (t._1,t._2.size)).toList
Spark
source.flatMap(_.split("
.map((.1))
.reduceByKey(_+_)
.collect
RDD 的算子大致分为两类:
Transformation 转换操作例 如map flatMap filter 等
Action 动作操作,例如 reduce collect show 等
执行 RDD 的时候,在执行到转换操作的时候,并不会立刻执行,直到遇见了 Action 操作,才会触发真正的执行,这个特点叫做惰性求值。
上图的代码中,scala 和 spark 中 rdd 的写法很相似。第一点是都可以写成链式。第2点,他们都通过算子传入函数来执行对数据的操作,rdd 本身的操作呢跟 scala 当中的这个集合的运算是非常相似的,在 rdd 当中有两类算子,这一点 scala 有一些区别。首先 rdd 当中第一类算子称之为叫做 transformation 转换操作,第二类算子称之为叫做 action 动作操作,那么转换操作它主要目的是定义一张执行图,好,rdd 并不是直接对算子进行计算。而是先去把整个的执行计划生成,有一个执行计划之后。
当一个 action 操作被执行的时候,触发这个执行计划的执行去执行这个执行计划,这是 rdd 的特点,和 scala 当中非常不一样的特点。那么这个特点称之为叫做堕性求值。更准确更清晰的表述就是 transformation 转换的操作例如 map 和 filter 这样的一些操作,并不触发 rdd 的执行,而只有执行的 reduce client show 这样的一些操作的时候,整个 rdd 它才会化为 job 运行到集群当中去求结果。主要生成一个类似于图的东西,图表达了 rdd 的计算逻辑,在进行action 操作去触发图的调动。
二、rdd 可分区。
Rdd 是可分区的,因为 rdd 是可以进行并行计算的框架,如果没有分区,无法把任务划分。
Rdd 的分区就是拆分任务,同时,只要有足够信息数据的来源,甚至可以不用严格保存数据,这个特点本质上就是把一个任务划分为小任务的过程。
RDD 是一个分布式计算框架,所以,一定是要能够进行分区计算的,只有分区了,才能利用集群的并行计算能力
同时,RDD 不需要始终被具体化,也就是说:RDD 中可以没有数据,只要有足够的信息知道自己是从谁计算得来的就可以,这是一种非常高效的容错方式。
三、rdd 是只读的
Rdd 只读,rdd 一旦生成,绝不可能发生变化。因为 rdd 存储在 hdfs 中,Hdfs 的文件只允许一种修改,是append,并且这个 append 是为了 hbase 而强行加上去的。
对于 rdd 来说,数据已经分布到集群当中了,如果想要随机访问这个 rdd 的某一个文件进行修改的话,就需要找到数据在哪里,还需要一系列繁琐操作,代价较高。所以 rdd 只能可读。
第一个原因是因为 rdd 可能只是进行数据流通,里面没有储存数据,所以不需修改。第二个原因是如果加入支持修改的话,就需要保存数据,显然这违背了 rdd 的初衷。第三个原因是如果需要修改数据,就需要找到数据具体位置,这显然很难做到。
四、rdd 可容错
任何计算系统当中,容错是一定要考虑的。对于 rdd 是一定要容错的措施。有俩种措施,第一种是保存 rdd 的依赖关系,如果 rdd2出现问题,那么就要保存 rdd1的信息,再重新计算,那么就需要保存俩部分信息,第一部分是 rdd 的父属是谁?Rdd2的父属是怎么计算出 rdd2的?
第二种措施是 Rdd2有可能会出错,那么就需要将 rdd2缓存下来。如果出错,有了缓存,就可以直接计算出结果。
RDD 的容错有两种方式·保存 RDD 之间的依赖关系,以及计算函数,出现错误重新计算。直接将 RDD 的数据存放在外部存储系统,出现错误直接读取,Checkpoint
五、总结
以上是 rdd 的一些特点,现在进行一个回顾。首先第一点是 rdd 不仅是数据集还是编程模型,rdd 的算子分为俩大类,第一类是 transformation,第二类是 action。
Rdd 还有一大特性叫惰性求值,也就是当 transformation 这个算子在执行的时候,并不会真的被执行,而只有在action 执行的时候,整体的过程才会被流转,才会被执行。
第二个特点是 rdd 可分区,分区了才有将任务分片的能力。
第三个特点是 rdd 是只读的,只有只读的特点,rdd 才能有这么高的间断性,而 rdd 才会保持足够的间断性,而 rdd是可以容错,常用手段有两种,第一种是追溯,第二种是制数据保存数据。