spark troubleshotting之解决YARN队列资源不足导致的application直接失败

现象:

如果,你是基于yarn来提交spark,比如yarn-cluster或者是yarn-client,你可以指定某个hadoop队列上的,每个队列都是有自己的资源的,

生产环境中,给spark用的yarn资源队列的情况:500G内存,200个cpu core

比如说,某个spark application,在spark-submit里面你自己配了,executor,80个,每个executor 4G内存,每个executor, 2个cpu core。你的spark作业每次运行大约消耗掉320G内存,以及160个cpu core

按计算来说,咱们的队列资源,是足够的,500G内存,200个cpu core

首先,第一点,你的spark作业实际运行起来以后,耗费掉的资源量,可能是比你在spark-submit里面配置的,以及你预期的,是要大一些的可能是400G内存,190个cpu core.

那么这是时候,的确,咱们的队列资源是还有一些剩余的,但是问题是,如果同时,你又提交了一个spark作业上去,那么就可能会出问题。

第二个spark作业,又要申请320G内存+160个cpu core.结果,发现队列资源不足

此时,可能会出现俩种情况,(具体出现哪中情况,跟版本,运维,配置都有关系)

1. Yarn 发现资源不足时,你的spark作业,并没有等待在那里,等待资源的分配,而是直接打印一行fail的log,直接fail掉了

2. Yarn 发现资源不足,你的spark作业,就等待在那里,一直等待之前的spark作业执行完,等待有资源分配给自己来执行

 

采用如下方案:

1. 在J2EE平台做一个限制,限制只能同时提交一个spark作业到yarn上去执行,确保一个spark作业的资源肯定是有的。

2. 你应该采用简单的调度区分的方式,比如,你的spark作业需要长时间运行,有的是短时间运行,此时,都提交到一个队列上去不合适,分队列,可以申请(跟你们的Yarn、Hadoop同学申请),给自己搞俩个调度队列,每个队列根据你要执行的作业情况来设置,在J2EE平台判断,如果是长时间作业,提交到一个队列,短时间提交到另一个队列

3. 你的队列里面,无论何时,只会有一个作业在里面运行,那么此时,就应该用我们的性能调优手段,去将每个队列能承受的最大的资源分配给你的每一个spark作业,

你可能感兴趣的:(spark)