一  基本术语

  Application:  基于Spark的用用户程序,包含了Driver程序和集群上的Executor.

  Driver Program: 运行行main函数并且新建SparkContext的程序.

  Cluster Manager: 在集群上获取资源的外部服务(例如:standalone,Mesos,Yarn ).

  Worker Node:集群中任何可以运行行应用用代码的节点.

  Executor: 是在一一个Worker Node上为某应用用启动的一一个进程,该进程负责运行行任务,并且负责将数据存在内存或者磁盘上。每个应用用都有各自自独立立的executors.

  Task:被送到某个executor上的工工作单元.

  Job:包含很多任务的并行行计算,可以看做和Spark的action对应.

  Stage:一一个Job会被拆分很多组任务,每组任务被称为Stage(就像Mapreduce分map任务和reduce任务一一样).

二  RDD介绍

  RDD是spark最根本的数据抽象, 它是一个数据集合, Spark的运行过程就是创建RDD, 并从一种RDD向另一种新的RDD转换, 最后将这些RDD上的数据收集, 从而得到我们想要的结果. RDD有以下五种属性(可以将RDD计算存储模型图):

  (1) 分区属性: 每个RDD包好多个分区, 这既是RDD的数据单位, 也是计算粒度, 每个分区在由一个Task线程处理. 在RDD创建的时候可以指定分区的个数, 如果没有指定, 那么, 默认分区的个数是CPU的核数. 每一块的分区对应一个内存上的bloak, 由BlockManager分配.

  (2) 计算属性: RDD不仅包含有数据, 还有在数据上的计算, 每个RDD以分区为计算粒度, 每个RDD会实现compute函数, compute函数会和迭代器(RDD之间转换的迭代器)进行复合, 这样就不需要保存每次compute函运行的结果.

  (3) 依赖属性: Spark的运行过程就是RDD之间的转换, 因此, 必须RDD之间的生成关系(新RDD是由哪个或哪几个RDD生成), 这就是所谓的依赖关系, 这样既有助于阶段和任务的划分, 也有助于在某个分区出错的时候, 只需要重新计算与当前出错的分区的有关的分区,而不需要计算所有的分区.

  (4)分片属性: 这个属性指的是RDD的partitioner函数(分片函数), 分区函数就是将数据元分配到指定的分区, 这个目前实现了HashPartitioner和RangePartitioner, 只有key-value的RDD才会有分片函数, 否则为none. 分片函数不仅决定了当前分片的个数, 同时决定parent shuffle RDD的输出的分区个数.

  (5)列表属性: 也就是说, 每个RDD会报粗一个列表, 而这个列表保存着分片优先分配给哪个Worker节点计算, spark坚持移动计算而布移动数据的原则. 也就是尽量在存储数据的节点上进行计算.

图 1  RDD的计算模型和存储模型

三  spark运行机制  

  Spark运行主要分为三部分:RDD的创建和转换DAGScheduler划分任务并生成TaskSetTaskScheduler将任务调度给Worker运行

  具体的分为下面四个过程, 可以结合图 2一起看, 这部分主要来自这篇骗博客, 这篇博客有例子,很详细,:

  (1) SparkContext(RDD相关操作): 在这个过程, 每次转换(transform)会创建一个新的RDD.

    →通过(提交RDD集合)

  (2) DAGScheduler(遍历RDD拆分Stage,生成作业): 这个过程会创建执行计划, Spark 会尽可能地管道化, 并基于是否要重新组织数据来划分阶段 (Stage).

    →通过(提交任务集TaskSet)

  (3) TaskScheduler: (任务调度管理): 这个过程调度任务, 将各阶段划分成不同的任务(Task), 每个任务都是数据和计算的合体, 在进行下一阶段前, 当前阶段的所有任务都要执行完成, 因为下一阶段的第一个转换一定是重新组织数据的, 所以必须等当前阶段所有结果数据都计算出来了才能继续.

    →通过(按照资源获取任务)

  (4) TaskSetManager: (任务调度管理)

  Task管理和序列化:

  Task的运行要解决的问题不外乎就是如何以正确的顺序, 有效地管理和分派任务. 如何将Task及运行所需相关数据有效地发送到远端,以及收集运行结果

  Task的调度源起于DAGScheduler调用TaskScheduler.submitTasks将一个Stage相关的任务集合(TaskSet)一起提交给TaskScheduler调度.

  TaskSchedulerImpl是TaskSchedulerImpl的实现, 在TaskSchedulerImpl中, 这一组Task被交给一个新的TaskSetManager实例进行管理, 所有的TaskSetManager经由SchedulableBuilder根据特定的调度策略进行排序,

  TaskSchedulerImpl的resourceOffers函数中,当前被选择的TaskSetManager的ResourceOffer函数被调用并返回包含了序列化任务数据的TaskDescription,最后这些TaskDescription再由SchedulerBackend派发到ExecutorBackend去执行

  序列化的过程中,App依赖文件相关属性URL等通过DataOutPutStream写出,而Task本身通过可配置的Serializer来序列化,当前可配制的Serializer包括如JavaSerializer ,KryoSerializer等

  Task的运行结果在Executor端被序列化并发送回SchedulerBackend,由于受到Akka Frame Size尺寸的限制,如果运行结果数据过大,结果会存储到BlockManager中,这时候发送到SchedulerBackend的是对应数据的BlockID,TaskScheduler最终会调用TaskResultGetter在线程池中以异步的方式读取结果,TaskSetManager再根据运行结果更新任务状态(比如失败重试等)并汇报给DAGScheduler等


图 2 任务调度过程

参考资料

1. Spark RDD简介与运行机制概述

2. Spark技术内幕 深入解析Spark内核架构设计与实现原理[M]

spark机制理解(一)的更多相关文章

  1. android的事件分发机制理解

    android的事件分发机制理解 1.事件触发主要涉及到哪些层面的哪些函数(个人理解的顺序,可能在某一层会一次回调其它函数) activity中的dispatchTouchEvent .layout中 ...

  2. ECshop中的session机制理解

    ECshop中的session机制理解     在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...

  3. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  4. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  5. Spark 快速理解

    转自:http://blog.csdn.net/colorant/article/details/8255958 ==是什么 == 目标Scope(解决什么问题) 在大规模的特定数据集上的迭代运算或重 ...

  6. JavaWeb三大组件——过滤器的运行机制理解

    过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...

  7. RunLoop机制理解

    一.浅识RunLoop RunLoop在开发中我们一直在用,但是没有注意他.要想理解RunLoop,首先我们需要先了解一下程序运行机制. 程序运行机制:我们都知道OC是运行时语言,也就是说对象的类型是 ...

  8. storm的acker机制理解

    转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6142356.html Storm 的拓扑有一些特殊的称为"acker"的任务,这 ...

  9. 【图解ASP.NET MVC运行机制理解-简易版】

    很多盆友咨询ASP.NET MVC的机制.网上也有好多.但是都是相当深奥.看的云里雾里的.我今天抽空,整理个简易版本.把处理流程走一遍. 当然,这个只是处理请求的一部分环节.百度的面试题“客户端从浏览 ...

随机推荐

  1. 当碰到需要调试打包后的js

    在react中经常开发碰到不能热更中进行调试的,如IE之类的 这个时候我们就需要打包才能运行看到效果, 但是往往每次打包都需要很长的时间: 这个时候我们就可以直接找到打包后的文件,直接在改文件中修改: ...

  2. 网络 OSI参考模型与TCP/IP模型

    ISO是国际标准化组织.OSI,开放互联系统.IOS,思科交换机和路由器的操作系统. TCP/IP模型是OSI模型的简化.所有的互联网协议都是基于OSI模型开发的. 分层:便于管理,每层只管理下层,总 ...

  3. SQL Server的优点与缺点

    一般来说索引会加快查询速度,但会影响插入,修改,删除的数据,且占用物理空间;所以我们应该合理的创建索引,而且应该先创建聚合索引,再创建非聚合索引.要在经常进行查询的列上创建索引,而且如果表列较少的话要 ...

  4. ES6-Generator

    Generator 关键词:状态机,遍历器,同步方式写异步方法 基本概念 形式上,Generator函数是一个普通函数,但是有两个特征. function关键字与函数名之间有一个星号. 二是,函数体内 ...

  5. 动态修改JDBC数据源配置

    因项目需要能动态修改数据源的配置,及修改后不用重启整个应用.使用的数据源是apache的BasicDataSource,网上千篇一律的是如下实现: BasicDataSource bds=getDat ...

  6. Python 3.0 写日志时出现乱码

    问题描述 python 3.0启用日志, 在pycharm里打开.log文件时中文都显示乱码. 根本原因 默认日志编译用的是GBK, 而python 3.0写程序用的是UTF-8. 所以.log文件中 ...

  7. 安装 jemalloc for mysql

    参考: MySQL bug:https://bugs.mysql.com/bug.php?id=83047&tdsourcetag=s_pcqq_aiomsg https://github.c ...

  8. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  9. Ubuntu安装 和 python开发

    在ubuntu上安装pycharm 可以好几种下载办法 1.pycharm之linux版本下载地址: https://download.jetbrains.8686c.com/python/pycha ...

  10. [翻译] NSRegexTester

    NSRegexTester This is a very simple Mac OS X application that allows you to test regular expressions ...