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)