Spark 之 Stage划分、数据本地性算法实现

来源:互联网 发布:lnmp php日志 编辑:程序博客网 时间:2024/05/17 01:49

Spark 之 Stage划分、数据本地性算法实现

[ 睡着的水-hzjs-2016.08.22 ]

一、Stage划分算法

---1、Spark Application 中可以因为不同的Action触发众多的Job,也就是说一个Application 中可以有很多的Job,每个Job是有一个还或者多个Stage构成的,后面的Stage依赖前面的Stage,也就是说只有前面依赖的Stage计算完毕后,后面的Stage才会运行;

---2、Stage划分的已经就是宽依赖,什么产生宽依赖呢?例如:reduceByKey、groupByKey等等;

---3、由Action(例如collect)导致了SparkContext.runJob的执行。最终导致了DAGScheduler中的submitJob的执行,其核心是通过发送一个case class JobSubbmitted 对象给eventProcessLoop,其中JobSubmitted 源代码如下:

##eventProcessLoop是DAGSchedulerEventProcessLoop的具体实例,而DAGSchedulerEventProcessLoop是EventLoop的子类,具体实现EventLoop的onReceive 方法。onReceive方法转过来回调doOnReceive。

---4、在doOnReceive中通过模式匹配的方式执行路由到


-----5、在handleJobSubmitted 中首先创建finalStage会建立父Stage的依赖链条;

补充:所谓的missing 就是要要进行当前的计算了!

二、Task 任务本地性算法实现

---1、在submitMissingTasks 中会通过调用以下代码获得任务的本地性:

2、具体一个Partition 中数据本地性的算法实现为下属代码:

---#算法实现的时候首先查询DAGScheduler的内存数据结构是否存在当前Partition的数据本地性的信息,如果有的话,则直接返回;如果没有,首先会调用rdd.getPreferedLocations;

---#例如想让spark运行在Hbase上或者一种现在还没有直接支持的数据库上面,此时开发者需要自定义RDD,为了保证Task计算的数据本地性,最为关键的方式是必须实现RDD的getPreferedLocations;

3、DAGScheduler计算数据本地性的时候巧妙的借助了RDD自身的getPreferedLocations中的数据,最大化的优化的效率,因为getPreferedLocations 中表明了每个Partition的数据本地性,虽然当前Partition可能被缓存,但是缓存默认星狂下肯定是和getPreferedLocations 中的Partition 的数据本地性是一致的,所以这就极大的简化Task 数据本地性算法和效率的优化。




0 0
原创粉丝点击