spark机制note
2015-07-31 11:23
423 查看
抄录自:data progressing with spark
spark按照应用,作业,stage,task几个层次分别进行调度,采用了经典的FIFO和FAIR等调度算法.
IO
在IO中将数据以块为单位进行管理, 需要处理的块可以 本机内存, 磁盘或者集群的其他机器中.
通信控制
通信对于命令和状态的传递极为重要, 通过AKKA进行通信.
容错
听过lineage checkpoint 进行容错性保证.
shuffle模块
shuffle机制进行了创新和优化.
![](http://img.blog.csdn.net/20150731093122668)
Rdd的action算子会触发job提交, 提交到spark的job生成rdd DAG, 有DAGscheduler转化为stageDAG, 每个stage中产生相应的task集合, taskscheduler将任务分发到executor执行. 每个人物对应相应的一个数据块, 使用用户的函数处理数据块.使用用户定义的函数处理数据块.
driverporgram
rddgraph
job
stage
task
两种方式:
用户启动客户端, 之后客户端运行用户程序, 启动Driver进程. 在Driver中启动或实例化DAGscheduler等组件.客户端的Driver想Master注册.
worker想master注册, master命令worker启动executor. worker通过创建executor-runner线程, 在此线程内部启动executorbackend进程.
executorbackend进程启动后, 向客户端Driver进程内的schedulerbackend注册,这样driver进程就能就能找到计算资源.driver的DAGscheduler解析应用中的RDDDAG并生成相应的stage,每个stage包含的taskset通过taskscheduler分配给executor,在executor内部启动线程池并行化执行task.
standalone
yarn
spark.scheduler.mode方式来让应用以FAIR模式调度
Stage的调度是由DAGScheduler完成的。 由RDD的有向无环图DAG切分出了Stage的有向无环图DAG。 Stage的DAG通过最后执行的Stage为根进行广度优先遍历,遍历到最开始执行的Stage执行,如果提交的Stage仍有未完成的父母Stage,则Stage需要等待其父Stage执行完才能执行。 同时DAGScheduler中还维持了几个重要的Key-Value集合结构,用来记录Stage的状态,这样能够避免过早执行和重复提交Stage。 waitingStages中记录仍有未执行
的父母Stage,防止过早执行。 runningStages中保存正在执行的Stage,防止重复执行。failedStages中保存执行失败的Stage,需要重新执行,这里的设计是出于容错的考虑。
2.TaskSetManager的调度
结合上面介绍的Job的调度和Stage的调度方式,可以知道,每个Stage对应的一个TaskSetManager通过Stage回溯到最源头缺失的Stage提交到调度池pool中,
在调度池中,这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然后一个Job内的TaskSetManager ID小的先调度,并且如果有未执行完的父母Stage的TaskSetManager,则是不会提交到调度池中。
1)如果是调用过cache()方法的RDD,数据已经缓存在内存,则读取内存缓存中分区
的数据。
2)如果直接能获取到执行地点,则返回执行地点作为任务的执行地点,通常DAG中最源头的RDD或者每个Stage中最开始的RDD会有执行地点的信息。 例如,HadoopRDD从HDFS读出的分区就是最好的执行地点。 这里涉及Hadoop分区的数据本地性问题,感兴趣的读者可以查阅Hadoop的资料了解。
3)如果不是上面两种情况,将遍历RDD获取第一个窄依赖的父亲RDD对应分区的执行地点。
spark主要模块
调度与任务分配spark按照应用,作业,stage,task几个层次分别进行调度,采用了经典的FIFO和FAIR等调度算法.
IO
在IO中将数据以块为单位进行管理, 需要处理的块可以 本机内存, 磁盘或者集群的其他机器中.
通信控制
通信对于命令和状态的传递极为重要, 通过AKKA进行通信.
容错
听过lineage checkpoint 进行容错性保证.
shuffle模块
shuffle机制进行了创新和优化.
执行机制
Rdd的action算子会触发job提交, 提交到spark的job生成rdd DAG, 有DAGscheduler转化为stageDAG, 每个stage中产生相应的task集合, taskscheduler将任务分发到executor执行. 每个人物对应相应的一个数据块, 使用用户的函数处理数据块.使用用户定义的函数处理数据块.
rdd
弹性分布式数据集, RDD作为数据结构,本质上是一个只读的分区记录集合。一个RDD可以包含多个分区,每个分区就是一个dataset片段。RDD可以相互依赖。如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为narrow dependency;若多个Child RDD分区都可以依赖,则称之为wide dependency。不同的操作依据其特性,可能会产生不同的依赖。例如map操作会产生narrow dependency,而join操作则产生wide dependency。spark应用
application是用户提交的应用程序, 执行模式有local, standalone, yarn, mesos.组件
applicationdriverporgram
rddgraph
job
stage
task
应用提交方式
Driver进程是应用的主控进程, 负责应用的解析,切分stage并调度task到executor执行, 包含DAGScheduler等重要对象.两种方式:
1. Driver进程运行在客户端, 对应用进行监控
./bin/run-example org.apache.spark.examples.SparkTC spark://UserHostIP:port
用户启动客户端, 之后客户端运行用户程序, 启动Driver进程. 在Driver中启动或实例化DAGscheduler等组件.客户端的Driver想Master注册.
worker想master注册, master命令worker启动executor. worker通过创建executor-runner线程, 在此线程内部启动executorbackend进程.
executorbackend进程启动后, 向客户端Driver进程内的schedulerbackend注册,这样driver进程就能就能找到计算资源.driver的DAGscheduler解析应用中的RDDDAG并生成相应的stage,每个stage包含的taskset通过taskscheduler分配给executor,在executor内部启动线程池并行化执行task.
2. 主节点制定某个Worker节点启动Driver,负责整个应用的监控
如果Driver在Worker启动执行需要通过org.apache.spark.deploy.Client类执行应用,命令如下。./bin/spark-class org.apache.spark.deploy.Client launch spark://UserHostIP:port file://your_jar org.apache.spark.examples.SparkTC spark://UserHostIP:port
spark调度与任务分配模块
调度配置
spark有多种运行模式: local standalone yarn mesos.standalone
spark.cores.max决定一个应用可以在整个集群申请的CPU core数。 注意,这个参数不是控 制单节点可用多少核
yarn
当Spark运行在YARN平台上时,用户可以在YARN的客户端通过配置--num-executors选 项控制为这个应用分配多少个Executor,然后通过配置--executor-memory及--executorcores来控制应用被分到的每个Executor的内存大小和Executor所占用的CPU核数。 这样便可 以限制用户提交的应用不会过多的占用资源,让不同用户能够共享整个集群资源,提升 YARN吞吐量。
Spark应用程序内Job的调度
户可以通过配置spark.scheduler.mode方式来让应用以FAIR模式调度
Stage和TaskSetManager调度方式
1.Stage的生成Stage的调度是由DAGScheduler完成的。 由RDD的有向无环图DAG切分出了Stage的有向无环图DAG。 Stage的DAG通过最后执行的Stage为根进行广度优先遍历,遍历到最开始执行的Stage执行,如果提交的Stage仍有未完成的父母Stage,则Stage需要等待其父Stage执行完才能执行。 同时DAGScheduler中还维持了几个重要的Key-Value集合结构,用来记录Stage的状态,这样能够避免过早执行和重复提交Stage。 waitingStages中记录仍有未执行
的父母Stage,防止过早执行。 runningStages中保存正在执行的Stage,防止重复执行。failedStages中保存执行失败的Stage,需要重新执行,这里的设计是出于容错的考虑。
2.TaskSetManager的调度
结合上面介绍的Job的调度和Stage的调度方式,可以知道,每个Stage对应的一个TaskSetManager通过Stage回溯到最源头缺失的Stage提交到调度池pool中,
在调度池中,这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然后一个Job内的TaskSetManager ID小的先调度,并且如果有未执行完的父母Stage的TaskSetManager,则是不会提交到调度池中。
Task调度
在DAGScheduler中提交任务时,分配任务执行节点。1)如果是调用过cache()方法的RDD,数据已经缓存在内存,则读取内存缓存中分区
的数据。
2)如果直接能获取到执行地点,则返回执行地点作为任务的执行地点,通常DAG中最源头的RDD或者每个Stage中最开始的RDD会有执行地点的信息。 例如,HadoopRDD从HDFS读出的分区就是最好的执行地点。 这里涉及Hadoop分区的数据本地性问题,感兴趣的读者可以查阅Hadoop的资料了解。
3)如果不是上面两种情况,将遍历RDD获取第一个窄依赖的父亲RDD对应分区的执行地点。
相关文章推荐
- Android Studio中使用git功能无法clone原因分析
- SSMS插件开发指南
- string类的编写
- 拆解探索MagSafe电源接口结构和指示灯变颜色原理
- 《月满西楼》——李清照
- Android关于buildToolVersion与CompileSdkVersion的区别
- JQM页面跳转,多种效果
- Android属性动画完全解析(上),初识属性动画的基本用法
- 获取安卓手机设备信息(cpu,手机内存,SD卡,运行内存,mac和开机时间)
- 前端:将网站打造成单页面应用SPA
- 图解程序员必须掌握的Java常用8大排序算法
- 多校联合第三场
- 显示日期和时间
- 指令集并行流水线CPU设计
- windowed模式视频渲染
- 使用culr
- NYOJ~喷水装置(一)
- strong 和 weak 的区别
- bc第六场Goffi and Squary Partition
- Android之——Surface、SurfaceView与SurfaceHolder.Callback初探