这篇文章主要为大家展示了“学习Spark需要了解的RDD知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“学习Spark需要了解的RDD知识点有哪些”这篇文章吧。
作业调度
当对RDD执行转换操作时,调度器会根据 RDD 的 lineage(血统)来构建由若干调度阶段(Stage) 组成的有向无环图(DAG),每个调度阶段包含尽可能多的连续窄依赖转换。调度器按照有向 无环图顺序进行计算,并最终得到目标RDD。
调度器向各节点分配任务釆用延时调度机制并根据数据存储位置(数据本地性)来确定。若一个任务需要处理的某个分区刚好存储在某个节点的内存中,则该任务会分配给该节点;如果在内存中不包含该分区,调度器会找到包含该RDD的较佳位置,并把任务分配给所在节点。
对应宽依赖的操作,在Spark将中间结果物化到父分区的节点上,这和MapReduce物化 map的输出类似,可以简化数据的故障恢复过程。如下图所示,实线圆角方框标识的是RDD。阴影背景的矩形是分区,若已存于内存中,则用黑色背景标识。RDD上一个行动操作的执行将 会以宽依赖为分区来构建各个调度阶段,对各调度阶段内部的窄依赖则前后连接构成流水线。在本例中,Stage 1的输出已经存在内存中,所以直接执行Stage 2 ,然后执行Stage 3
Spark如何计算作业调度阶段
对于执行失败的任务,只要它对应调度阶段父类信息仍然可用,该任务会分散到其他节点 重新执行。如果某些调度阶段不可用(例如,因为Shuffle在map节点输出丢失了),则重新提交相应的任务,并以并行方式计算丢失的分区。在作业中如果某个任务执行缓慢(即Straggler), 系统则会在其他节点上执行该任务的副本。该方法与MapReduce推测执行做法类似,并取最先得到的结果作为最终的结果。
调度器
RDD 模型将计算分解为多个相互独立的细粒度任务,这使得它在多用户集群能够支持多种资源共享算法。特别地,每个 RDD 应用可以在执行过程中动态调整访问资源。
Spark 提供了uoduo 种持久化 RDD 的存储策略:
第一个选项的性能是最优的,因为可以直接访问在Java虚拟机内存里的RDD对象;在空间有限的情况下,第二种方式可以让用户釆用比Java对象更有效的内存组织方式,但代价是降低了性能;第三种策略使用于RDD太大的场景,每次重新计算该 RDD会带来额外的资源开销(如I/O等)。
对于内存使用 LRU 回收算法来进行管理,当计算得到一个新的 RDD 分区,但没有足够空间来存储时,系统会从最近最少使用的 RDD 回收其一个分区的空间。除非该 RDD 是新分区对应的 RDD,这种情况下 Spark 会将旧的分区继续保留在内存中,防止同一个 RDD 的分区被循环调入/调出。这点很关键,因为大部分的操作会在一个 RDD 的所有分区上进行,那么很有可能已经存在内存中的分区将再次被使用。
以上是“学习Spark需要了解的RDD知识点有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。