InfoQ深入浅出Spark(三):Spark调度系统之“权力的游戏”( 二 )
SparkContext 初始化聚义厅的头三把交椅职业摄影师之所以能够持续产出高品质的作品 , 关键在于他们善于因地制宜、根据场景的变化灵活地切换视角 。 为了更好地理解 Spark 这个复杂而精密的分布式系统 , 我们不妨把它想象成一家建筑集团公司 —— Driver 是总公司 , Executor 是分公司 。 我们暂且给这家集团公司取名为“斯巴克” , 斯巴克公司的主要服务对象是建筑设计师 , 设计师负责提供设计图纸 , 而斯巴克公司的主营业务是将图纸落地、建造起一栋栋高楼大厦 。 很显然 , 把图纸变成大厦可不是一件容易的事情 , 需要很多人分工协作方能完成 。
首先 , 公司需要能够看懂图纸并将其转化为建筑项目的架构师 , 斯巴克公司从友商那里挖角了行业知名架构师“戴格”(DAGScheduler) 。 集团公司给戴格安排的角色是总公司的空降领导 , 并要求两位创始元老“塔斯克”和“拜肯德”竭尽全力配合戴格的工作 。 塔斯克(TaskScheduler)一毕业即加入斯巴克公司 , 现任总公司施工经理 , 成功指挥完成了多个大大小小的工程项目 , 业绩突出 , 深得公司赏识 。 拜肯德(SchedulerBackend)和塔斯克大学的时候就是上下铺 , 关系好得穿一条裤子 , 现任总公司人力资源总监 , 负责与分公司协调、安排人力资源 。 从公司的安排来看 , 三位老板的分工还是比较明确的 。
本文插图
斯巴克建筑公司的三位大佬
简单介绍了斯巴克建筑公司 , 我们再说回 Spark , 在上一篇《内存计算的由来—— DAG》中我们讲到 DAGScheduler 如何将 DAG 拆分为 Stages 。 Stages 拆分只是 Spark 分布式任务调度的第一步 , 要将 Stages 进一步转化为可执行的分布式任务 , Driver 需要众多的对象组件来进行任务拆解、计算资源协调、任务进度跟踪等工作 , 如 TaskScheduler、TaskSetManager、TaskResultGetter、MapOutputTracker、SchedulerBackend 等对象 , 这其中 , 最重要的两个对象就是 TaskScheduler 和 SchedulerBackend 。 所有这些对象 , 都是伴随着 Driver 进程中 SparkContext(或 SparkSession)的初始化而创建的 。
之所以说塔斯克和拜肯德是公司元老 , 原因在于 , 在 SparkContext 的初始化中 , TaskScheduler 和 SchedulerBackend 是最早且同时被创建的两个服务于 Spark 调度系统的接口抽象 。 两者的关系非常微妙 , SchedulerBackend 在构造方法中引用 TaskScheduler , 而 TaskScheduler 在初始化时会引用 SchedulerBackend 。 SchedulerBackend 接口抽象的创建基于 Spark 的 MasterURL , 也即各位看官在使用 spark-submit 或 spark-shell 时指定的 --master 参数 , 如 --master spark://ip:host(Standalone 模式)、--master yarn(YARN 模式) 。
为了支持多样的资源调度模式(Standalone、YARN、Mesos) , SchedulerBackend 提供了与之对应的多个实现类 , 类之间的依赖与继承关系如下图所示 。 因此 , Spark 采用哪种实现类来创建 SchedulerBackend , 完全取决于开发者提供的 MasterURL , SchedulerBackend 与资源管理器强绑定 , 是资源管理器在 Spark 中的代理 。 硬件资源与人力资源一样 , 都是“干活儿的” , 如果用人力资源来类比硬件资源 , 那么“拜肯德”(SchedulerBackend)就是名副其实的人力资源总监 。
本文插图
SchedulerBackend 类图对于划分的每一个 Stage , DAGScheduler 会为之创建对应的任务集合 TaskSet 。 DAGScheduler 以 TaskSet 为粒度向 TaskScheduler 提交任务调度请求 。 TaskScheduler 在初始化的过程中 , 除了引用 SchedulerBackend 之外 , 还会创建任务调度队列 。 任务调度队列用于缓存 DAGScheduler 提交的 TaskSet , TaskScheduler 结合 SchedulerBackend 提供的 Worker Offer , 按照预先设置的调度策略(FIFO 或 FAIR)依次对队列中的任务进行调度 。 简言之 , DAGScheduler 手里有“活儿” , SchedulerBackend 手里有“人力” , TaskScheduler 的核心职能就是把合适的“活儿”派发到合适的“人”手里 , 所谓把专业的事情交给专业的人去做 。
- InfoQ前Uber CTO加入韩国最大电商公司Coupang
- InfoQ未来 5 年将是 Go 语言的天下 | 极客大学
- InfoQ科技 Angular转到 React,网易严选的前端工程化实践,从
- InfoQ科技从 Angular转到 React,网易严选的前端工程化实践
- InfoQ网易严选数据产品实践
- 卡美琪|深入浅出,讲讲翡翠如何看种水的好坏?
- 战锤游戏说|Spark火花锦标赛:小孩发挥失常,QIUQIU杀出成为冠军
- InfoQ明星开源产品实践历程,从技术构建到营销革命
- InfoQ充满想象,5G+X解锁云端划时代创新场景
- InfoQ谁是无价之猿?测一测你的coding身价(内有大礼)| Q推荐