Spark-资源调度

Master中的对象

    在Spark资源调度过程中,Master中有三个对象比较重要。

val workers = new HashSet[WorkerInfo]()
val waitingDriver = new ArrayBuffer[DriverInfo]
val waitingApps = new ArrayBuffer[ApplicationInfo]

    其中,当Spark集群启动的时候,Worker节点会向Master节点发送心跳,Worker节点的信息汇总在workers对象中。
    当waitingDriver和waitingApps有数据时,会反调schedule()方法。

资源调度流程

1.客户端执行spark-submit提交命令,在客户端会启动一个sparksubmit进程

spark-submit --,master spark://node01:7077 --deploy-mode cluster ...

2.为Driver向master申请资源

当waitingDrivers集合中元素不为空,说明有客户端向master申请资源了,
此时应该查看当前集群的资源情况(会查看workers集合),找到符合要求的节点,
启动Driver,当Driver成功启动,这个申请资源的信息从waitingDrivers中删除掉。

3.Driver启动成功后,向Master为当前的Application申请资源

当waitingApps集合不为空时,说明有Driver向master为当前的Application申请资源,
查看集群的资源情况(workers集合)找到合适的Worker节点,启动Executor进程,
默认情况下,每一个Worker为当前的Application只启动一个Executor,
这一个Executor会使用1G内存和这个Worker所管理的所有的core。

资源调度结论

1.默认情况下,每一个为当前的Application只会启动一个Executor,这个Executor默认使用1G内存和当前Worker所能管理的所有core
2.如果想要在一个Worker上启动多个Executor,在提交Application的时候,要指定executor使用的core数

--executor-cores

3.默认情况下,Executor的启动,是轮询方式来启动的。

轮询的启动方式在一定程度上有利于数据的本地化

影响Executor个数的因素

因素 解释
–executor-cores 每个executor所管理的核数
–executor-memory 每个executor所管理的内存
–total-executor-cores 整个Application最多所使用的核数
worker num worker节点的个数
worker memory 每个worker节点的内存
worker core 每个worker几点的核数

启动Executor个数的公式
min(min(wm/em, wc/ec) * wn, tec/ec)

猜你喜欢

转载自blog.csdn.net/love__guo/article/details/85198718