AWS EMR YARN集群提交任务一直处于ACCEPT状态

AWS EMR YARN集群提交任务一直处于ACCEPT状态

本集群是通过AWS EMR启动的,AWS EMR可以通过脚本配置需要提交的任务和运行的集群机器数量。但基本运行后,AWS就会启动一个集群,并将任务提交到集群上运行。
但是诡异的问题出现了(如下图):
AWS EMR YARN集群提交任务一直处于ACCEPT状态
可以看到,我提交了四个任务,有一个任务处于RUNNING状态,另外三个处于ACCEPTED状态。但集群的总内存资源为1.05T,VCore为180个,已使用的内存为606.63 GB,已使用的VCore为51个。也就是说,当前集群还有大量的空闲资源,另外三个任务为什么会一直处于ACCEPT状态呢?

正常处于ACCEPT状态可能有两个原因。第一个原因可能是当前正在运行的任务数量达到了集群允许同时运行的任务数量的上限。可目前集群只有一个任务在运行,肯定没有达到此上限。第二个原因可能是集群资源不足,任务在等待其他任务释放资源。可当前任务还有大量的空闲资源,资源充足的。

这两个原因都不成立,那到底是什么原因呢?感觉这个问题很诡异,一脸懵逼。

后来再仔细看了下这个集群的状况,发现了一些不正常的地方。
AWS EMR YARN集群提交任务一直处于ACCEPT状态
在标红处,这个数字代表此任务使用的资源数占据了Yarn Queue的505.5%,怎么会出现505.5?怎么会这么大?显然此任务所在的default队列已经被其占满了。

AWS EMR YARN集群提交任务一直处于ACCEPT状态
再回头看其他任务,其他任务也都提交在default队列中。所以,原因可能找到了,是default队列资源不足了。

问题又来了,default队列怎么会资源不足呢?我们来看下YARN queue的情况。
AWS EMR YARN集群提交任务一直处于ACCEPT状态
我们可以看到,队列有两个Partition,这个其实是hadoop引入的YARN Node Labels。就是将集群中的每台机器可以打上Labels,当提交任务可以指定一个Label,从而任务就会提交到有着此Label的机器上。

AWS EMR集群中的节点分为三类Master, Core和task。Understanding Master, Core, and Task Nodes
在AWS EMR 5.19之后上提交任务时默认将Application master的Container只放在到Core机器上,但这一特性在EMR 6.X后默认不再设置。
AWS EMR YARN集群提交任务一直处于ACCEPT状态
回头再看上面的YARN Queue情况,Partition:<DEFALLUT_PARATION>的使用率为51.2%,Partition的使用率高达95.5%,资源已被正在运行的任务几乎占满了,这背后的原因是,虽然EMR要求Application master的Container必须在CORE上,但没有不允许其他的非AM的Container在CORE上,那个唯一运行的任务把AM和非AM的Container都放在了CORE上,最后导致CORE被占满。
AWS EMR YARN集群提交任务一直处于ACCEPT状态

这时其他任务再提交时,由于CORE已满,无法将AM Container放在CORE上,只能等待CORE释放出资源,因而一直处于ACCEPTED状态。

再补充分析下那个505.5是怎么出现的。
606.63 * 1024 / 122880 = 5.05525
AWS EMR YARN集群提交任务一直处于ACCEPT状态
AWS EMR YARN集群提交任务一直处于ACCEPT状态
最后我的解决方法是将yarn.node-labels.enabled设置为false,而在AWS EMR上还可以将版本升级到6.0.0来解决问题。