YARN基于IO资源的隔离调度
前言
众所周知,目前YARN所支持的资源类型主要有2两大类:内存和CPU.但是其实对于操作系统层面,还有一个重要的资源是没有被YARN考虑在内的,就是IO资源,这里的IO资源你可以理解为比如说存储空间的容量,但是它其实也可以有其它的含义。目前YARN这种不考虑IO资源状况的调度方式,会造成有些container会消耗大量的IO资源,尽管可能他们只用了一点点的,内存和CPU资源。所以把IO资源也作为YARN调度的一个需求条件之一,是一个大有好处并且有其使用场景的功能点。
IO资源的概述
刚刚在上文已经提过了,这里的IO资源并不仅仅是指磁盘容量空间,它还可以是一种别的能力,比如说iops(每秒io次数),带宽等等。只是说,为了方便理解,我们暂且以磁盘空间作为一个节点IO资源的表示,磁盘空间越多,代表其所能处理的io次数也自然比较多。
YARN基于IO资源的调度和隔离
这里我们主要关注2点:
- 一个是IO资源的调度,这个调度关注的点主要是防止io资源的过度分配,导致过载的问题。
- 还有一个是IO隔离的问题。类似于CPU使用的隔离,我们同样要保证一定的IO资源使用隔离,防止不同用户应用的相互干扰。
IO资源的调度
IO资源的调度在YARN层面,我们想让IO也作为其中的一个判断条件,就要把它也作为一个资源field,比如我们这里用vdisk来表示需要的IO资源,vdisk越大,表示需要的IO资源越多,新的资源请求实例对象定义如下:
message ResourceProto {
optional int32 memory = 1;
optional int32 virtual_cores = 2;
optional int32 vdisks = 3;
}
就是说在ResourceManager在分配container的时候,还需要带上vdisk资源的请求判断,这里每个节点的vdisk资源可以以2倍于实际磁盘数的标准来配置,逻辑上的含义即为IO处理能力的一种抽象。
IO资源的隔离
类似于Cgroup下的CPU隔离,我们在系统IO层面也可以做类似的进程间的隔离。这里会用到Cgroup下的blkio子系统,它可以用来做这方面的控制隔离。
blkio子系统的IO隔离目前有2种方式:
- 第一种,基于权重值设置的CFQ(完全公平调度算法)。每个进程会按照规定比例权重允许执行相应的IO操作数量。
- 第二种,IO上限值的操作控制,这里不仅仅可以是IO的操作数,还可以是带宽流量的限制。
这里的IO隔离,主要指以上提到的2点。而对于具体采用哪种方式,我们可以通过在YARN内设置不同的隔离类来使用。
不过目前基于IO资源的调度方面,并没有在社区完全被实现,不过这个功能的可用性和实施使用这块还是有其实际的使用用途的,感兴趣的同学可以前往YARN-2139.
参考资料
[1].https://issues.apache.org/jira/browse/YARN-2139. Support for Disk as a Resource in YARN