开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:深入 RDD 问题-分解和容错】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11960
深入 RDD 问题-分解和容错
内容介绍:
一、如何将计算任务分解在集群中
二、如何进行移动数据步入移动计算的优化
三、如何进行移动数据步入移动计算的优化
四、如果任务特别复杂,流程很长,许多rdd之间有依赖关系,如何进行优化?
一、如何将计算任务分解在集群中
首先分解要分为两个端,第一个端是计算端,计算端要能够分解,第二端叫储存端,也要能够分解。存储侧比较常见的能分解的 HDFS,一个文件可以在不同的 HDFS 上来处理。计算侧如何配合存储侧来进行处理?可以将 rdd 变成可分区,每一个分区可以对应不同的 rdd 的 block 分区,第二个 rdd 需要延续一个 rdd,进行分期和计算。
有时存储侧不能分区,那在计算侧单独分区分析也可。通过上述操作可能会认为:Rdd 不能单独存放数据。但其实是可以的,rdd 虽然是一个数据结构,但是不存数据也是数据结构,不存放数据,只进行数据流通,也可以是数据结构。
Rdd 不一定是存储 rdd 当中整个的文件,这些文件可能是 rdd 的一个分区,代表 hdfs 的一个分区。Rdd 既然是一个计算引擎计算框架,就可以针对 hdfs 分区来分 rdd 的分区,就是一个天然可分区的结构。如何进行分解?如果是hdfs,那么一个分区对应一个 hdfs 的分区,所以 rdd 至少是可以分片的。
二、如何进行移动数据步入移动计算的优化
如果在 note01上存储了一个 hdfs,需要让处理 block 的 rdd 分区也调度到 note01上处理,尽量让存储的单元靠近计算的单元,甚至直接调度到同一台机器上。
如果无法调度到同一台机器上,尽量调度到一个机架上。同一个机架的数据之间,来进行数据拷贝的速度比较快。如果无法调度到同一个机架上,也要调度到同一个机房里面。
三、在集群中运行,需要多个节点之间配合,出错概率也较,出错后应如何处理?
举个例子,假如有1000台机器,每台机器出错率为99%,可用性为99%,那么整个集群的可用性为30%左右,如果这样的话,就不能保证每台机器都可用。出错了之后,如何处理?因此在大数据之中,容错一定要考虑的。考虑调度容错,消息丢失的容错等。假如出错的概率变高,如何容错?
常见的容错手段:直接记录数据本身,比如有一个 hdfs 的文件,处理的时候,rdd 将整个文件存在集群之中,出错的时候在进行恢复,直接备份一整份数据。下图中,如果是 rdd2出错的话,那么进行重新计算出来也可。即追述。
总结即为两种方法:一是整个备份下来,二是进行追述。
第二种是记录依赖关系,记录 rdd2和 rdd1是有依赖关系的,而 rdd2是由 rdd1计算得来的。
当2出问题,再拿1重新计算一遍,得到一个新的2,就可以解决问题。但有一个前提是要清楚 rdd2是由谁计算得来的,记录依赖关系。第二是整体大致函数关系,假如说 rdd2是通过 rdd1.map(//)得到的。
所以 rdd3调用的 rdd2调用的一个 filter 得到。假如说 rdd3失败了,即通过 rdd2进行 filter,就得到 rdd3,如果rdd2页丢失了,就通过 rdd1再进行 map,就得到 rdd1。这样就清楚了这三者的依赖关系。
RDD1→RDD2→RDD3这个过程中,RDD2出错了,有两种办法可以解决
1.缓存 RDD2的数据,直接恢复 RDD2,类似 HDFS 的备份机制
2.记录 RDD2的依赖关系,通过其父级的 RDD 来恢复 RDD2,这种方式会少很多数据的交互和保如何通过父级 RDD 来恢复?
1.记录 RDD2的父亲是 RDD1
2.记录 RDD2的计算函数,例如记录 RDD2=RDD1.map(.),map(..)就是计算函数
3当 RDD2计算出错的时候 可以通过父级 RDD 和计算函数来协复 RDD2
四、如果任务特别复杂,流程很长,许多 rdd 之间有依赖关系,如何进行优化?
下图中有15个流程,那么如果再记录依赖关系,过程会变得很复杂,因此采用把整个数据保存下来进行容错。
上面提到了可以使用依赖关系来进行容错,但是如果依赖关系特别长的时候,这种方式其实也比较低效,这个时候就应该使用另外一种方式,也就是记录数据集的状态
在 Spark 中有两个手段可以做到
1.缓存
2. Checkpoint