(二)Spark学习系列
2016-04-28 18:00
197 查看
(一)讲到了stage划分好了,这一章我开始学习任务是如何下发并且执行的。
在spark计算出了哪些partition是需要重新计算的后,便开始各个partition生成计算的task,然后封装成为taskset,然后提交给taskscheduler。一个taskset里面存的是一组逻辑 完全相同的task。
每个taskscheduler对应了一个 schedulerBackend,schedulerBackend 负责和clustermaster交互,取得该application分配到的资源,并且将这些资源传给taskscheduler,由taskscheduler将资源给task
首先,createTaskScheduler动作创建了不同的taskscheduler还有schedulerBackend,创建的依据是目前所用的资源管理平台,例如standalone,mesos,Yarn
task的提交
task是被提交到TaskScheduler,最后层层的调用,最后将任务下发到executor上面执行。
一个taskset会被加载到一个tasksetmanager里面,然后tasksetmanager会被加到schedulerbuilder里面。
schedulerbuilder里面有多重实现方式,以FIFO的实现方式为例,这个实现的就是FIFO调度方式。那么任务是按照什么顺序被调度的呢?
FIFO--->根据taskID的大小来调度,JobID小的先调度,如果JobID相同,那么,stageID小的先调度(同一个Job中多个stage可以并行执行的)
task运算结果的处理
task在executor执行完后,executor会回传结果给driver。会通过Driver发送StatusUpdate更新好了消息通知Driver任务的状态更新为TaskFinished。Driver又要将任务更新转台通知TaskScheduler,然后会在这个executor上面分配新的计算任务。
executor端回传结果有三种策略:
(1)太大(当然,就是超过门限 maxResultSize,可配置)就丢弃
(2)较大将其以tid为key存到BlockManager里面,也就是传元数据
(3)不大,直接回传结果给Driver
(*Question:为什么要以两种方式进行数据的获得呢?哈哈观了论文:key来啦参看论文里面提到的是:Spark提供了三种对持久化RDD的存储策略:未序列化Java对象存于内存中、序列化后的数据存于内存及磁盘存储。第一个选项的性能表现是最优秀的,因为可以直接访问在JAVA虚拟机内存里的RDD对象。在空间有限的情况下,第二种方式可以让用户采用比JAVA对象图更有效的内存组织方式,代价是降低了性能。
8第三种策略适用于RDD太大难以存储在内存的情形,但每次
重新计算该RDD会带来额外的资源开销,额,后面又和DSJ讨论了下,DSJ的观点是:“数据量大了,不能够盲目的发,只能够先存起来,然后需要的时候再去取。”后来想了下,貌似有道理,确实,executor并不晓得driver能够容纳多大的数据,这个时候如果盲目的发送数据的话,内存崩溃了怎么办。 然后等待driver取数据的时候,自己去取数据,那么自己内存多大,能够容得下多少数据自己也是自己知道的,自己把自己搞蹦了,就不怪executor了。)
Driver端对结果的处理是:
首先启动一个线程item来取结果,线程item做的如下动作,通过本地读取或者的远程读取获得。
如果这个task是resulttask,下来就会运行用户自定义的函数。
如果这个task是shuffleMapTask,首先需要把结果保存到stage中,
如果这个stage的所有的task都完成了,需要将整体结果注册到MapOutPutTrackerMaster中,然后,下一个stage就可以通过它来取得Shuffle结果的元数据。
如果这个stage对应的是laststage,那么当这个stage执行完毕后,这个Job就执行完毕了。
=============the end================
在spark计算出了哪些partition是需要重新计算的后,便开始各个partition生成计算的task,然后封装成为taskset,然后提交给taskscheduler。一个taskset里面存的是一组逻辑 完全相同的task。
每个taskscheduler对应了一个 schedulerBackend,schedulerBackend 负责和clustermaster交互,取得该application分配到的资源,并且将这些资源传给taskscheduler,由taskscheduler将资源给task
首先,createTaskScheduler动作创建了不同的taskscheduler还有schedulerBackend,创建的依据是目前所用的资源管理平台,例如standalone,mesos,Yarn
task的提交
task是被提交到TaskScheduler,最后层层的调用,最后将任务下发到executor上面执行。
一个taskset会被加载到一个tasksetmanager里面,然后tasksetmanager会被加到schedulerbuilder里面。
schedulerbuilder里面有多重实现方式,以FIFO的实现方式为例,这个实现的就是FIFO调度方式。那么任务是按照什么顺序被调度的呢?
FIFO--->根据taskID的大小来调度,JobID小的先调度,如果JobID相同,那么,stageID小的先调度(同一个Job中多个stage可以并行执行的)
task运算结果的处理
task在executor执行完后,executor会回传结果给driver。会通过Driver发送StatusUpdate更新好了消息通知Driver任务的状态更新为TaskFinished。Driver又要将任务更新转台通知TaskScheduler,然后会在这个executor上面分配新的计算任务。
executor端回传结果有三种策略:
(1)太大(当然,就是超过门限 maxResultSize,可配置)就丢弃
(2)较大将其以tid为key存到BlockManager里面,也就是传元数据
(3)不大,直接回传结果给Driver
(*Question:为什么要以两种方式进行数据的获得呢?哈哈观了论文:key来啦参看论文里面提到的是:Spark提供了三种对持久化RDD的存储策略:未序列化Java对象存于内存中、序列化后的数据存于内存及磁盘存储。第一个选项的性能表现是最优秀的,因为可以直接访问在JAVA虚拟机内存里的RDD对象。在空间有限的情况下,第二种方式可以让用户采用比JAVA对象图更有效的内存组织方式,代价是降低了性能。
8第三种策略适用于RDD太大难以存储在内存的情形,但每次
重新计算该RDD会带来额外的资源开销,额,后面又和DSJ讨论了下,DSJ的观点是:“数据量大了,不能够盲目的发,只能够先存起来,然后需要的时候再去取。”后来想了下,貌似有道理,确实,executor并不晓得driver能够容纳多大的数据,这个时候如果盲目的发送数据的话,内存崩溃了怎么办。 然后等待driver取数据的时候,自己去取数据,那么自己内存多大,能够容得下多少数据自己也是自己知道的,自己把自己搞蹦了,就不怪executor了。)
Driver端对结果的处理是:
首先启动一个线程item来取结果,线程item做的如下动作,通过本地读取或者的远程读取获得。
Run(){ 取得结果的类型: case 直接的计算结果: result = 本地结果反序列化 case 远程的结果{ 连接远程的机器 result = 远程结果反序列化 将结果上面的Blockid删除 } handleSuccessFulTask(taskSetManager,tid ,result)//负责处理获取到的计算结果 }对于resultTask,通过调用JobWaiter来告知调用者任务已经结束。
如果这个task是resulttask,下来就会运行用户自定义的函数。
如果这个task是shuffleMapTask,首先需要把结果保存到stage中,
如果这个stage的所有的task都完成了,需要将整体结果注册到MapOutPutTrackerMaster中,然后,下一个stage就可以通过它来取得Shuffle结果的元数据。
如果这个stage对应的是laststage,那么当这个stage执行完毕后,这个Job就执行完毕了。
=============the end================
相关文章推荐
- 基于独立Zookeeper集群的Hbase 安装配置实验
- 大数取余
- 约瑟夫环及其变种算法 java实现
- 第三章 数据结构与算法概述
- 两点之间方向
- (转)平方根的快速算法(sqrt)
- Servlet监听器
- 在Ubuntu下实现本地套接字(socket)通信以及遇到的问题!
- Objective-C中的Block
- java批量清除文件注释
- 正则表达式知识详解之回溯引用 (java版示例)
- Navicat Premium for Mac 11.1.8 中文破解版
- 10 个 OS X El Capitan 高级技巧推荐
- GraphicBuffer和Gralloc模块
- poj2528 离散化+线段树区间更新
- 字符串相关操作
- React Native开发专题介绍
- 大数乘法
- css font-style:italic与oblique的区别
- ANativeWindow