问题简述:我们日常开发中,有时会在yarn队列中发现一个现象,spark任务跑得很舒服,而且占了很多资源,MR任务拿不到资源一直卡在那里,提交MR的同事就很气,抱怨spark抢占资源,实际真的是这样么?我们针对这个问题进行以下探究。常见现象如下,资源紧张时比较常见,看如图中的Spark任务持有的Container普遍多于MR任务持有的Container
有的小伙伴可能没有耐心,咱们先给下结论!!!(文章结尾还有提升竞争力优化思路)
不是的,并不是Spark抢占资源,而是MR和Spark模型决定的。
MapReduce 多进程模型
MapReduce 应用程序是让每个Task 动态申请资源,且运行完后马上释放资源,这就会有一个问题,Task就一直重复着申请资源,释放资源。
特点:
-
每个Task 运行在一个独立的JVM 进程中
-
可单独为不同类型的Task 设置不同的资源量,目前支持内存和CPU 两种资源
-
每个Task 运行完后,将释放所占用的资源,这些资源不能被其他Task 复用,即使是同一个作业相同类型的Task。也就是说,每个Task 都要经历“申请资源—> 运行Task –> 释放资源”的过程
Spark 多线程模型<