spark-资源调度

    技术2022-07-10  136

    一、src

    资源调度是hadoop和spark之间的中介

    二、调度角色

    1. cluster manager

    主、集群管理器,负责对整个集群的资源进行分配,不是spark的角色,是yarn的。

    在yarn模式下是RM,standalone下是master

    资源分配分为一、二级,cm属于一级分配,就是把worker上的内存、cpu分配到application级别,但不会细致到executor和task。也就是粗粒度的分配。具体executor和task分配到多少,由spark app自己决定,跟cm无关。driver负责二级分配。 比如把资源分给山东省,但不会具体到哪个市。

    须知

    一个spark-shell就是一个app,也是需要资源的,在yarn的页面也会有显示。

    2. worker

    资源调度框架中的概念,并不是spark中的。yarn中叫NM,sa中叫worker

    作用

    同master通信 将自己的内存, CPU 等资源通过注册机制告知 Cluster Manager 同步资源信息, Executor 状态信息给 ClusterManager 等.创建 Executor进程,里面会跑很多task线程将资源和任务进一步分配给 Executor

    三、spark角色

    1. driver

    不仅仅资源调度使用主从,spark的app管理也是用主从,driver就是主,executor是从。driver用来拆解app分配task、提交task、监控、获取结果。 一个spark app的整个生命周期不仅仅是在集群上执行,还包括提交到cm、申请资源、化简、分布式执行、监控执行状况、获取监控执行结果。其中除了分布式执行,别的都在driver中进行。

    比如代码中的map、filter算子,就是在driver执行的,但map中的参数函数,是在各个节点分别执行的。

    作用

    app转成job,拆解为stage和task、提交task、进行2级资源分配在 Executor 之间调度任务(Task)跟踪 Executor 的执行情况,并通过 UI 展示查询运行情况

    2. executor

    Spark Executor 节点是负责在 Spark 作业中运行具体任务,任务彼此之间相互独立。 Spark 应用提交时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。 如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。

    作用

    负责运行组成 Spark 应用的任务,并将结果返回给驱动器(Driver);它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。Block Manager 用来管理RDD中的缓存数据。RDD 的数据是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

    3. app

    用户使用 Spark 提供的 API 编写的应用程序,其实就是用户对于要进行的计算的蓝图。

    Application 通过 Driver 将 Application 注册到 Cluster Manager.Cluster Manager 将会根据 Application 的资源需求, 通过一级分配将 Executor, 内存, CPU 等资源分配给 ApplicationDriver 通过二级分配将 Executor 等资源分配给每一个任务, Application 最后通过 Driver 告诉 Executor 运行任务

    yarn中有个角色叫AppMaster,用来管理app的,其实就是用来跑driver的

    四、Yarn模型

    总览:

    1. cluster模式

    app提交后,在jps进程列表,提交节点会发现多了一个spark-submit的进程,过一会,还会出现AppMaster、CoarseGrainedExecutorBackend进程,其中Executor有可能会有多个。

    1. spark-submit脚本

    执行spark-submit脚本,最终会启动deploy.SparkSubmit 类。 此步SparkSubmit 类用来解析传入的参数 + 设置集群的运行环境参数,比如master、deploy-mode

    设置环境。主要是childMainClass的设置,cluster下,是o.a.s.deploy.yarn.Client,client下,就是用户的driver类

    在命令行中执行最后输出的日志就是这个类控制的。

    yarn-client和yarn-cluster是老版本的写法

    如果以spark、mesos这种字符串开头,就是对应的模式。

    deploy-mode默认是client

    spark自带kerberos认证的功能,只要配置如下2个参数。但好像没找到循环认证的代码,难道只能认证一次??

    SparkSubmit 类中的 main方法在cluster模式下反射调用Client的main方法;会调用submitApplication()来向yarn提交应用返回appId,submitApplication()中会创建yartnClient的作用就是在yarn上启动一个AM,yartnClient是yarn提供的api 这里的Client的意思是相对于yarn的意思,是yarnClient,用来给yarn提交app 环境设置完执行runMain方法,通过反射获取Client类。然后执行它的main Client创建YarnClient,然后向Yarn发送执行指令:bin/java ApplicationMaster; 此时有一步要确定yarn的AM的类,显然,client和cluster下AM的类是不同的。 之后就是创建app,开始提交,把app交给yarn 的RM管理。启动AM实际上使用的是yarn提供的一个shell 调用o.a.s.deploy.yarn.AM类的main后,会创建AM类,最终执行master.run() 调用master.run()后,调用runDriver() RM收到shell命令后会在随机的NM中启动ApplicationMaster;启动完之后SparkSubmit类的主要作用结束,但不会停止,因为还要打印日志。 AM启动意味着调用一个main,会创建一个RMClient,因为AM需要跟RM通信 master.run()就是启动AM。AM启动后:ApplicationMaster执行runDriver方法启动Driver线程,执行用户的作业;driver是个子线程 执行runDriver后使用线程的await等待用户代码中的SparkContext初始化完再继续执行。之后会join AM的main线程,开启一个子线程userThread等待用自己的driver(UserClass)执行完再结束。 userThread线程的名字就叫driver, 以上可知,AM有主子2个线程。driver就是AM的一个子线程,AM的主线程会等待driver执行完再结束。

    此时,只开了一个Submit进程,还没开始执行自己写的代码,只执行了一个Submit类的main,然后在Submit类的main中又执行了Client的main。此时还没有设置到资源分配,还没有开始申请资源,要driver启动才开始一级资源分配 Submit类的作用:简单说就1一个,启动了AM和driver。具体包括封装参数,通过反射创建yarnClient类,确定AM的节点和类,然后远程调用shell把app提交给RM,RM去启动AM。AM是个进程,跟Spark-submit并列。

    cluster和client2种模式下childMainClass是不同的,client直接把args的mainClass赋予,而cluster模式因为要在随机的AM中启动driver,所以还要通过一个o.a.s.deploy.yarn.Client

    通过反射调用别的类时,看源码就不是连续的,要跳转。

    运行drvier,创建SparkContext SparkContext有很多属性,其中SechdulerBackend用来通信,RpcEndpointRef用来接收心跳信息,DAGScheduler用来划分dag。 master和appName必需有: 在SC的构造器中,调用了,创建了ds,启动了ts,ts和sB在ds之前创建

    运行driver的同时,AM启动后,会创建一个RMClient,用来向RM注册 申请资源;申请资源的依据就是S-S中的参数。申请意味着RM在NM中创建container。 AM根据cluster和client2种模式,会执行不同的类,执行AM类的main中,会启动一个子线程执行dirver(通过反射main方法),然后在子线程driver中初始化sparkContext。 RM收到申请,会在指定节点上创建container。

    获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBacken; 启动executor进程, 启动ExecutorBackend成功后, 并向driver注册。==》反向注册

    注册成功后, ExecutorBackend进程会创建一个Executor对象. AM在NM的container中启动ExecutorBackend进程,启动成功后反向向driver注册。注册信息包括ip、内存、cpu核数等。driver收到后返回注册成功,executor收到注册成功后才创建executor对象,注意跟ExecutorBackend进程区分。 executor的run方法中运行的就是算子中的匿名函数。

    Driver会给ExecutorBackend分配任务, 并监控任务的执行.

    Processed: 0.013, SQL: 9