zoukankan      html  css  js  c++  java
  • spark任务调度

     Application

    application(应用)其实就是spark-submit提交的spark应用程序。一个完整的Spark应用程序包含如下几个基本步骤:

    1. 获取输入数据(通过序列获取,读取HDFS,读取数据库,读去S3等!)
    2. 处理数据(具体的代码逻辑)
    3. 输出结果(导入到HDFS,Hbase,MySQL等存储)

    从spark官网的这幅图可以简单看出,提交一个spark应用程序会创建一个driver端来管理这个spark应用程序。和YARN的ApplicationMaster相似,完成任务的调度以及与executor和ClusterManager协调。有两种模式,client以及cluster模式。client模式将driver运行在spark-submit执行的机器中,cluster则是在spark集群中随机挑选一台执行。如果spark调度器集成了YARN,那么这两种模式在YARN中也有类似的体现!

    Spark Application 的执行框架如图所示。 一个 Spark Application 由两
    部分构成: Driver Program 和若干 Executor。 其中 Driver Program 中包含了 Spark Context 和 main 函
    数; Executor 是 Worker 中用于运行 Task 的进程。 在执行 Spark Application 过程中,集群上的资源如
    何调度,由 Cluster Manager 进行管理。

    Driver Program

    Spark Driver Program(以下简称Driver)是运行Application的main函数并且新建SparkContext实例的程序。其实,初始化SparkContext是为了准备Spark应用程序的运行环境,在Spark中,由SparkContext负责与集群进行通信、资源的申请、任务的分配和监控等。当Worker节点中的Executor运行完毕Task后,Driver同时负责将SparkContext关闭。通常也可以使用SparkContext来代表驱动程序(Driver)。

    Driver(SparkContext)整体架构图如下所示:

    SparkContext

    SparkContext是通往Spark集群的唯一入口,可以用来在Spark集群中创建RDDs、累加器(Accumulators)和广播变量(Broadcast Variables)。SparkContext也是整个Spark应用程序(Application)中至关重要的一个对象,可以说是整个Application运行调度的核心(不是指资源调度)。

      SparkContext的核心作用是初始化Spark应用程序运行所需要的核心组件,包括高层调度器(DAGScheduler)、底层调度器(TaskScheduler)和调度器的通信终端(SchedulerBackend),同时还会负责Spark程序向Master注册程序等。

    Worker

    Worker Node: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slaves文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点
    • 主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务,worker就类似于包工头,管理分配新进程,做计算的服务,相当于process服务。
    • 需要注意的是:
      • 1)worker不会汇报当前信息给master,worker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给mater,master分配的时候就知道worker,只有出现故障的时候才会发送资源。
      • 2)worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。

    Executor

    是 Worker 上为某个 Application 启动的一个进程,该进程负责执行任务并且负责将数据存储在内存或者磁盘中 。 Executor 拥有 CPU 和内存资源,它是资源管理系统能够给予的最小单位。一个 Worker 节点上可能有多个 Executor,但是每个 Executor 中仅执行一个 Application 对应的任务。 也就是说 ,不同的 Application 通过 Executor 无法共享数据。

    Task

    Task 即任务,是被送到 Executor 上执行的工作单元 。 RDD 中的每个分区都对应相应的 Task ,而每个 Task 对应于 Executor 中的一个线程,这使得系统更加轻量级, Task 之间切换的时间延迟更短。

    Job

    Job 即作业,是包含多个 Task 的并行计算,其与 Application 中的执行操作一一对应,也就是说
    Application 每提交一个执行操作 Spark 对应生成一个 Job 。

    Stage

    通常执行操作之前会有若干个转换操作,而每个转换操作意味着父 RDD 到子 RDD 的转换,因
    此一个 Job 中通常涉及多个 RDD。 将 Job 中涉及的 RDD 进行分组,每组称为一个 Stage。

    Cluster Manager

    是在集群上获取资源的外部服务。若是 Standalone 模式的 Spark 集群, Cluster Manager 即为 Master;
    若是基于 Yam 模式的 Spark 集群, Cluster Manager 即为 Resource Manager。

    Job、Stage、Task 划分方法

    Job 是以 Action 方法为界,遇到一个 Action 方法则触发一个 Job;
    Stage 是 Job 的子集,以 RDD 宽依赖(即 Shuffle)为界,遇到 Shuffle 做一次划分;
    Task 是 Stage 的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个 task。

    Spark 任务提交流程

    提交一个 Spark 应用程序,首先通过 Client 向 ResourceManager 请求启动一个
    Application,同时检查是否有足够的资源满足 Application 的需求,如果资源条件满
    足,则准备 ApplicationMaster 的启动上下文,交给 ResourceManager,并循环监控
    Application 状态。
     
      当提交的资源队列中有资源时,ResourceManager 会在某个 NodeManager 上启
    动 ApplicationMaster 进程,ApplicationMaster 会单独启动 Driver 后台线程,当 Driver
    启动后,ApplicationMaster 会通过本地的 RPC 连接 Driver,并开始向 ResourceManager
    申请 Container 资源运行 Executor 进程(一个 Executor 对应与一个 Container),当
    ResourceManager 返回 Container 资源,ApplicationMaster 则在对应的 Container 上启
    动 Executor。
     
      Driver 线程主要是初始化 SparkContext 对象,准备运行所需的上下文,然后一
    方面保持与 ApplicationMaster 的 RPC 连接,通过 ApplicationMaster 申请资源,另一
    方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲 Executor 上。
     
      当 ResourceManager 向 ApplicationMaster 返 回 Container 资源时,
    ApplicationMaster 就尝试在对应的 Container 上启动 Executor 进程,Executor 进程起
    来后,会向 Driver 反向注册,注册成功后保持与 Driver 的心跳,同时等待 Driver
    分发任务,当分发的任务执行完毕后,将任务状态上报给 Driver。
     
      从上述时序图可知,Client 只负责提交 Application 并监控 Application 的状态。
    对于 Spark 的任务调度主要是集中在两个方面: 资源申请和任务分发,其主要是通
    过 ApplicationMaster、Driver 以及 Executor 之间来完成。
     
     

    Spark 任务调度概述

    当 Driver 起来后,Driver 则会根据用户程序逻辑准备任务,并根据 Executor 资源情况逐步分发任务。Spark 的任务调度总体来说分两路进行,一路是 Stage 级的调度,一路是 Task级的调度,总体调度流程如下图所示: 

    参考资料

    https://blog.csdn.net/addUpDay/article/details/89112712

    https://www.cnblogs.com/xiaoyh/p/13696500.html

    https://www.cnblogs.com/libin2015/p/12795157.html

  • 相关阅读:
    第五篇
    第四篇
    PAT Basic 1094 谷歌的招聘 (20 分)
    PAT Basic 1093 字符串A+B (20 分)
    Dubbo 04 服务化最佳实现流程
    Dubbo 03 Restful风格的API
    Dubbo 02 微信开发
    Dubble 01 架构模型&start project
    PAT Basic 1020 月饼 (25 分)
    PAT Basic 1019 数字黑洞 (20 分)
  • 原文地址:https://www.cnblogs.com/xumaomao/p/15269480.html
Copyright © 2011-2022 走看看