Yarn是否会识别节点可用核心并合理调度Spark Structured Streaming应用的执行器?
Yarn是否会识别节点可用核心并合理调度Spark Structured Streaming应用的执行器?
首先可以明确告诉你:Yarn完全知道每个节点的可用资源情况,它绝对不会随机把执行器(Executor)分配到资源不足的节点上——资源调度本身就是Yarn最核心的职责之一。
具体来说,Yarn的ResourceManager(RM)会维护一个全局的资源状态视图:所有NodeManager(NM)会定期通过心跳机制向RM汇报自己节点的已用/可用vcores、内存等资源情况。当你的Spark Structured Streaming应用提交时,Spark会先向RM申请对应的资源(这里就是5个Executor,每个需要5vcores,总计35vcores)。
RM的调度器(默认是CapacityScheduler,也可以配置FairScheduler)会基于这个全局资源视图,筛选出满足资源要求的节点:
- 像你提到的Node Manager 3,有40个可用vcores,完全能容纳这5个Executor(5*5=35 ≤40),调度器大概率会把所有Executor都分配到这个节点上;
- 而那些可用vcores不足的节点(比如Node Manager 5/6可用0,Node Manager 2/4/9可用1,Node Manager7/8可用2),单个节点连一个Executor需要的5vcores都满足不了,RM根本不会考虑把Executor分配到这些节点上;
- 哪怕你的应用需要的资源分散到多个节点才能满足(比如如果需要60vcores,Node Manager3的40不够,就会再结合Node Manager10的18,再找其他有剩余的节点补),调度器也只会从有足够剩余资源的节点里挑选。
可能你会担心会不会出现“随机分配”的情况,但实际上Yarn的调度逻辑是完全基于实时资源数据的,它不会做无意义的资源分配——毕竟如果把Executor分配到资源不足的节点,根本启动不起来,这对整个集群的稳定性和资源利用率都是有害的。
总结一下:你的这个Spark应用会被Yarn合理调度到有足够可用vcores的节点上(比如Node Manager3),完全不需要担心它乱分配到资源不够的机器。
备注:内容来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

