Spark 任务等待与运行策略
前面我们提到了 Spark 的资源分配策略,资源配置有静态和动态两种模式,不同模式在任务提交后会有不同的内存占用行为,但是由于队列资源是有限的,因此会出现任务因为资源不够导致等待的情况。本节来详细分析一下任务提交后在的等待与运行影响因素。
一、资源分配策略回顾
前面我们讲过,spark 有两种资源分配策略。静态分配策略下,spark 任务提交后,会直接根据配置参数来申请资源,并且一直持有特定的资源直至任务结束。动态分配策略下,spark 任务提交后,会根据资源最小配置来申请资源,申请到后就开始运行,这期间如果还有额外资源并且 spark 任务还需要额外资源,会继续占用额外资源。
二、静态分配下的任务等待与运行根据上述的策略,我们来先分析任务提交后的几种状态:
首先我们规定用 Resource(X)表示 X 的资源总数,例如 Resource(Q)代表队列资源大小;
如上图:
Resource(A)+Resource(B)< Resource(Q)
这种情况下,队列资源充足,那么 A 任务启动,B 任务也可以启动;
如上图:
Resource(A)+Resource(B) > Resource(Q)
这种情况下,队列资源紧张,那么 A 任务启动,B 任务因为得不到需要的资源,因此会 Pending,直到申请到所需的资源大小;
三、动态资源分配下的等待与运行
上述的两种场景不难理解,对于动态资源分配策略下,一个任务会有一个初始的资源配置,我们称之为任务运行最小资源需求,同时我们为了避免任务无休止的吃资源,会设置一个上限。
如上图:
Resource(A)+Resource(B)< Resource(Q)
这种情况下,A 任务启动,B 任务也可以启动,与静态类似;
如上图:
Resource(A)+Min(Resource(B))< Resource(Q)
&& Resource(A)+Resource(B)> Resource(Q)
这中情况下,A 任务启动后,B 任务会达到最小资源需求,因此可以运行。
当 A 任务结束后,B 任务会继续申请资源,如果资源充足会达到最大资源状态。
如上图
Resource(A)+Min(Resource(B)) > Resource(Q)
当 A 任务启动后剩余的资源连 B 最小的资源需求都满足不了时,B 任务会 Pending 等待。
四、小结
根据上述的几种情况,我们在提交任务的时候,如果是动态资源策略(推荐)的情况下,为了避免 spark 任务一直 pending,我们可以将最小资源需求配置的小一点,这样至少可以保证 spark 任务能够尽快的启动起来,如果资源慢慢充裕了任务还可以继续吃资源。
版权声明: 本文为 InfoQ 作者【小舰】的原创文章。
原文链接:【http://xie.infoq.cn/article/8da552c759a1b78fff4651c10】。文章转载请联系作者。
评论