大数据学习笔记(spark资源调度)

1、绪论

我们运行一个Spark应用程序时,首先第一步肯定是写一个Spark Application应用程序,然后调用资源调度器为Driver申请资源。申请成功后,向master为Application申请资源,申请完毕后,调用资源调度器把任务分发到节点执行。在各个节点进行分布式的并行计算。

2、前置知识

对于Application来说,资源是Executor。对于Executor来说资源是内存、core。
  Master里面有几个对象:workers、waitingDrivers、waitingApps。下面对这几个对象做一个简单介绍.

val works = new HashSet[WorkInfo]()  //存储worker节点资源信息
val waitingDrivers = new ArrayBuffer[DriverInfo]()   //存储Driver节点申请的资源信息
val waitingApps = new ArrayBuffer[ApplicationInfo]()   //存储application所需要的申请的资源信息

在上面的代码中,WorkInfo代表的是work节点的节点信息。DriverInfo是Driver发送过来的请求信息。ApplicationInfo是发送过来的Application的信息。

val works = new HashSetWorkInfo
  works 集合采用HashSet数组存储work的节点信息,可以避免存放重复的work节点.(worker节点在异常挂掉以后,在下一次通信中,会将worker的节点信息从set集合中删除,但是如果worker节点挂掉后,在下一次通信之前又恢复工作,那么set中的节点信息是不会被删除的)

val waitingDrivers = new ArrayBufferDriverInfo
  当客户端向master为Driver申请资源时,会将要申请的Driver的相关信息封装到master节点的DriverInfo这个泛型里,然后添加到waitingDrivers 里。master会监控这个waitingDrivers 对象,当waitingDrivers集合中的元素不为空时,说明有客户端向master申请资源了。此时应该先查看一下works集合,找到符合要求的worker节点,启动Driver。当Driver启动成功后,会把这个申请信息从waitingDrivers 对象中移除。

val waitingApps = new ArrayBufferApplicationInfo
  Driver启动成功后,会为application向master申请资源,这个申请信息封存到master节点的waitingApps 对象中。同样的,当waitingApps 集合不为空,说明有Driver向Master为当前的Application申请资源。此时查看workers集合,查找到合适的Worker节点启动Executor进程,默认的情况下每一个Worker只是为每一个Application启动一个Executor,这个Executor会使用1G内存和所有的core。启动Executor后把申请信息从waitingApps 对象中移除。

注意点:上面说到master会监控这三个集合,那么到底是怎么监控的呢???
  master并不是分出来线程专门的对这三个集合进行监控,相对而言这样是比较浪费资源的。master实际上是‘监控’这三个集合的改变,当这三个集合中的某一个集合发生变化时(新增或者删除),那么就会调用schedule()方法。schedule方法中封装了上面提到的处理逻辑。

3、流程图

在这里插入图片描述

4、详细步骤

1、执行提交命令,会在client客户端启动一个spark-submit进程(用来为Driver申请资源)。
  2、为Driver向Master申请资源,在Master的waitingDrivers 集合中添加这个Driver要申请的信息。Master查看works集合,挑选出合适的Work节点。
  3、在选中的Work节点启动Driver进程(Driver进程已经启动了,spark-submit的使命已经完成了,关闭该进程)。
  4、Driver进程为要运行的Application申请资源(这个资源指的是Executor进程)。此时Master的waitingApps 中要添加这个Application申请的资源信息。这时要根据申请资源的要求去计算查看需要用到哪些Worker节点(每一个节点要用多少资源)。在这些节点启动Executor进程。
  (注:轮询启动Executor。Executor占用这个节点1G内存和这个Worker所能管理的所有的core)
  5、此时Driver就可以分发任务到各个Worker节点的Executor进程中运行了。

5、默认启动的方式

1、默认情况下,每一个Executor只会为每一个Application启动一个Executor。每个Executor默认使用1G内存和这个Worker所能管理的所有的core。
  2、如果想要在一个Worker上启动多个Executor,在提交Application的时候要指定Executor使用的core数量。提交命令:spark-submit --executor-cores
  3、默认情况下,Executor的启动方式是轮询启动,一定程度上有利于数据的本地化。

6、问题

假设我们有5个worker,每个worker节点提供10G内存,10个core。

1、spark-submit --master … --executor-cores 2 --executor-memory 2G … 在集群中会启动多少个Executor进程???
  25

2、spark-submit --master … --executor-cores 3 --executor-memory 4G … 在集群中会启动多少个Executor进程???
  10

3、spark-submit --master … --executor-cores 2 --executor-memory 2G --total-executor-cores 10 … 在集群中会启动多少个Executor进程???(–total-executor-cores:整个Application最多使用的core数)
  5

4、spark-submit --master … --executor-cores 2 --executor-memory 2G --total-executor-cores 4 … 集群中Executor的分布情况???(–total-executor-cores:整个Application最多使用的core数)
  随机找两台Worker节点。

5、启动Executor个数的公式:*min(min(wm/em,wc/ec)wn,tec/ec)
  注:–executor-cores : ec
    --executor-memory : em
    --total-executor-cores : tec
    worker_num : wn
    worker_memory : wm
    worker_core : wc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值