Spark源码阅读笔记一——part of core

内部accumulator通过心跳报告给driver
task运行时可以累加accumulator,但是不能读取value,value只能在driver获取
spark内部用一个weakhashmap保存accumulator,便于gc的清理

CacheManager
spark的类用于负责传递RDD的分区内容给BlockManager,并保证一个节点不会载入一个rdd的两份拷贝,这个通过一个hashset实现,已载入的rdd会将id保存到set中
获取和计算rdd时,先判断是否已经计算,如果没有再从blockmanager获取block然后计算结果。
除非是本地模式,不然rdd的计算结果都会缓存
如果rdd不需要在内存中缓存,则直接将计算结果通过iterator直接传给blockmanager
在rdd需要缓存时,我们必须小心不能在内存中一次性展开全部的partition,否则如果jvm没有足够的空间给这个单个的partition可能会引发OOM异常。
取而代之的是,我们展开这些value,小心的、可能的放弃并丢掉这个partition到磁盘如果合适。
如果空间足够就全部缓存到内存中,否则如果使用磁盘就放到磁盘,不然直接就返回value

Dependency
NarrowDependency:一个子partition依赖于多个父partition
ShuffleDependency:shuffle stage的输出依赖,在shuffle中,rdd是短暂的因为我们在executor端不需要它

ExecutorAllocationClient
与cluster manager请求或杀掉executor的客户端
根据我们的调度需要更新集群,依赖于三个信息
1 executor的数量,我们需要的全部的executor数,cluster manager不能杀掉任何运行中的executor来达到这个数量,这是我们想要分配的executor数量
2 所有要运行的stage中有本地偏好的task数量,包括运行等待和完成的task
3 task到运行host的map

ExecutorAllocationManager(EAM)
一个代理,根据工作负载动态的分配和移除executor
EAM维护一个移动的目标executor数量,定期的同步到cluster manager。target的数量从配置的一个初始值开始,并根据等待和运行task数变化
在当前的target数量多于需要控制的当前的负载时,会减少target数量。target总是会一次性减到可以运行所以当前运行和等待task的数量
当需要响应积压的等待需要调度的task时,会增加target的数量。如果一个队列在N秒内没有排空,则新的executor被加入。如果这个队列仍然在另外的M秒内存在,则更多的executor会被加入。增加的数量在每轮以上一轮的指数级增加,直到达到上限。上限是基于一个配置的属性和当前运行和等待任务的数量。
指数增长有双重理由。
1 executor应该在开始缓慢的增加,以防万一额外需要的executor数量很小。否则我们增加了多于我们需要的executor数量则我们需要在后面移除他们。
2 executor的数量需要快速增加,以防万一executor的数量最大值非常高,否则在繁重的工作负载下性能提升需要很长时间。
executor移除的策略很简单,如果一个executor已经空闲了K秒,意味着它没有被调度用于执行任何task,因而移除它。
这里没有重试的逻辑,因为我们假定cluster manager最终会异步的执行所有它收到的请求。
相关的spark属性如下

成员变量initializing,是否需要一直等待初始化的executor集合被分配,当这个变量为true的时候,我们不会取消未执行的executor请求。这个在下面两种情况会被设置成false
1 一个stage被提交
2 一个executor的空闲时间超时
用于增加减少executor的调度任务是一个定时任务,每100毫秒执行一次
调度方法上,首先基于添加时间和我们当前的需要调整我们请求的executor,然后如果一个已存在的executor已经过期了,则杀掉。

updateAndSyncNumExecutorsTarget:更新target数量并同步结果到cluster manager。检查我们已存在的分配和之前的请求超过我们现在的需要。如果满足,truncate target数量并让cluster manager知道以便于它可以取消不需要的等待的请求。如果不满足,并且添加的时间超时,看看我们是否能请求新的executor,并刷新添加时间。

当一个executor(程它为executor X)因为到达了下限而没有被删除,则它不会再被标记位空闲。当有新的executor加入,我们不再在最低下限,则我们必须再次标记executor X为空闲,以使我们不会忘记它是一个被移除的候选。
当scheduler的队列是空的时候,就会将addtime设为未设置
所有cache的block会被报告给driver,但不包括广播的block
当executor执行任务了(busy),就会清除它的idle time
private val stageIdToExecutorPlacementHints = new mutable.HashMap[Int, (Int, Map[String, Int])]
stageid到tuple的map,tuple是节点和将会在这个节点上运行的task的数量
taskstart和blockmanageradded这些事件是在不同的线程执行的,因而顺序不一定,taskstart事件中将对应的executor置为busy
taskend,如果executor不再运行任何调度的任务,则标记为idle
如果task失败,则会将scheduler置为积压任务的状态,将这个task从这个stage对应的task列表中移除

时间: 2024-08-31 21:08:18

Spark源码阅读笔记一——part of core的相关文章

Three.js源码阅读笔记(基础的核心Core对象)_基础知识

Three.js是一个比较伟大的webgl开源库,它简化了浏览器3D编程,使得使用JavaScript在浏览器中创建复杂的场景变得容易很多.Github上众多webgl demo令我兴奋不已,跃跃欲试.由于这个库还处在开发阶段,因此资料非常匮乏,爱好者大部分时间不得不通过阅读该库的源码进行学习,我现在也准备这样做. 这是第一篇笔记,先从最基础的核心(Core)对象开始. Core::Vector2 该构造函数用来创建一个表示二维向量的对象 复制代码 代码如下: THREE.Vector2 = f

Apache Storm源码阅读笔记&OLAP在大数据时代的挑战

 <一>Apache Storm源码阅读笔记 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1. 设置应用程序环境 define("ENVIRONMENT", "development"); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch

《Spark大数据分析实战》——2.4节配置Spark源码阅读环境

2.4 配置Spark源码阅读环境 由于Spark使用SBT作为项目管理构建工具,SBT的配置文件中配置了依赖的jar包网络路径,在编译或者生成指定类型项目时需要从网络下载jar包.需要用户预先安装git.在Linux操作系统或者Windows操作系统上(用户可以下载Git Shell,在Git Shell中进行命令行操作)通过"sbt/sbt gen-idea"命令,生成Intellij项目文件,然后在Intellij IDE中直接通过"Open Project"

php中get_adjacent_post函数PHP源码阅读笔记

这个函数是wordpress里的一个函数,作用是获取相邻的POST文章. 函数并不大,有效代码大概只有70行左右,但是里面包含的知识不少,所以专门用一篇文章来解释一下. get_adjacent_post函数的源码位于wp-includes/link-template.php中. 我会通过"//roc:"在引出源码阅读笔记. /**  * Retrieve adjacent post.  *  * Can either be next or previous post.  *  * @

Three.js源码阅读笔记(Object3D类)_基础知识

这是Three.js源码阅读笔记的第二篇,直接开始. Core::Object3D Object3D似乎是Three.js框架中最重要的类,相当一部分其他的类都是继承自Object3D类,比如场景类.几何形体类.相机类.光照类等等:他们都是3D空间中的对象,所以称为Object3D类.Object3D构造函数如下: 复制代码 代码如下: THREE.Object3D = function () { THREE.Object3DLibrary.push( this ); this.id = THR

emacs+ensime+sbt打造spark源码阅读环境

概述 Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为.不巧的是,当前java社区中很流行的ide如eclipse,netbeans对scala的支持都不算太好.在这种情况下不得不想到编辑器之神emacs,利用emacs+ensime来打造scala编程环境. 本文讲述的步骤全部是在arch linux上,其它发行版的linux视具体情况变通. 安装scala pacman -S scala 安装sbt pacman -S sbt 安装ensim

Spark修炼之道(高级篇)——Spark源码阅读:第二节 SparkContext的创建

博文推荐:http://blog.csdn.net/anzhsoft/article/details/39268963,由大神张安站写的Spark架构原理,使用Spark版本为1.2,本文以Spark 1.5.0为蓝本,介绍Spark应用程序的执行流程. 本文及后面的源码分析都以下列代码为样板 import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String])

Spark修炼之道(高级篇)——Spark源码阅读:第一节 Spark应用程序提交流程

作者:摇摆少年梦 微信号: zhouzhihubeyond spark-submit 脚本应用程序提交流程 在运行Spar应用程序时,会将spark应用程序打包后使用spark-submit脚本提交到Spark中运行,执行提交命令如下: root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit --master spark://sparkmaster:7077 --class SparkWordC