spark rdd

本文面向的读者是具有一定spark使用经验,想提升对spark理解的童鞋们。

RDD 是spark最主要的抽象(其他两个是Accumulator 和 BroadCast)。一个RDD 本身是一个java(scala)对象,它代表的是分布在集群中不同节点上的数据。那么很自然,这个对像的属性如下:

1 a list of partitions: 也就是构成这个 RDD 的partition

2 a  function for computing each split:作用与这个RDD的partition上的函数

3 a list of dependencies on other RDDs: 对其他 RDD 的依赖

4 (可选)a partitioner for key-value RDDs:对于key-value类型的RDD,当进行shuffle时如何将一个k-v映射到不同的reduce 阶段的partition。

5 (可选)a list of preferred location to computer each split on:为了提高效率,每个parition尽可能在存储它的那个节点。这个主要是对从hdfs文件读数据时涉及到的。


下面再来谈谈 RDD 的action。action将会触发Sparkontext对像的 runJob方法,这一步是将 RDD 的计算函数真正发布到集群上去执行。

SparkContext 将job交给调度层 DASGScheduler 对象去处理,处理完毕以后调用 TaskScheduler的submitTasks 方法。

TaskScheduler 是一个接口,它的实现类是TaskSchedulerImpl, TaskSchedulerImpl 根据不同的集群,将 task 发送给不同的 ExecutorBackend 去执行。

ExecutorBackend 是一个trait:它的实现类有:LocalSchedulerackend,StandaloneSchedulerBackend ,YarnClientSchedulerBackend,YarnClusterSchedulerBackend,MesosExecutorBackend 


下面再来看看另一对像: DAGScheduler

这个对象是spark框架中的调度层,spark所有的job都是交给这个对象去进行调度的。那么这个对象的作用是什么?

1  计算每个job 的 stage 的 DAG图

2 跟踪哪个stage 的输出结果已经执行完毕

3 寻找调度 stage 的最优策略(比如利用cache中的rdd加速执行)

4 根据不同的集群(local,standalone,yarn,mesos),将 stages 中的 taskset 交给 TaskScheduler  。


下面就讲讲如何划分不同的stage。

spark 的stage 是根据RDD shuffle的边界划分的。RDD窄依赖的操作被划分为一个stage,不同的task被合并成一组连续执行的task,窄依赖的操作比如Lmap filter 等等。这个stage执行完毕会将数据持久化到本地磁盘。然后下一个stage从磁盘中读取数据开始执行。这儿要注意的是,持久化到磁盘的数据会一直保存,如果下面再有其他RDD依赖此stage,则直接从磁盘读取数据即可,不需要再进行计算了,这个stage阶段的文件会丢失,暂时还不知道是为什么,丢失以后会重新计算的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值