2022-04-18
分享到
首先介绍我们在实际生产中的业务场景,描述下实际场景中的业务需求。
在我们的业务场景下,有多种分布式作业类型,具体包括:
· MapReduce作业:我们使用MapReduce进行CPU运算,但MapReduce在2.10.1版本中也开始正式支持GPU运算[1]。
· Spark作业:一般是使用CPU进行运算,同时还可以通过参数来控制其是否调用GPU进行运算;
· MPI作业[2]:同Spark,可能需要使用GPU来加速运算;
· AI作业:一般是使用GPU进行运算,也可以使用CPU进行运算[3]。
[3]https://github.com/tensorflow/ecosystem/blob/master/spark/spark-tensorflow-distributor/spark_tensorflow_distributor/mirrored_strategy_runner.py
由于在我们当前的场景下,大部分是CPU作业,所以当GPU节点没有作业运行时,还需要可以将其节点上的CPU资源共享出来,供CPU作业使用,这样可以有效的防止资源浪费。
为了能够很好的支持当前业务场景下多种不同类型的分布式作业运行的需求,需要Yarn具备以下能力:
· 需要支持GPU资源的管理调度
· 支持CPU、GPU混合异构集群的管理能力
Yarn在2.10版本后开始支持GPU的管理功能,目前仅支持capacity调度方式来管理GPU,通过配置resource-types.xml、yarn-site.xml、capacity-scheduler.xml后实现了Yarn对GPU的管理,可与CPU、内存资源一同纳入队列的资源分配池中,作为队列的可用资源供作业申请使用,基本配置如下:
· resource-types.xml文件:
|
· capacity-scheduler.xml:
|
在实际应用中,遇到了一个官网上没有提及的问题,即$HADOOP_HOME/etc/hadoop/container-executor.cfg文件的所有父目录的owner都需要为root,有两种方式解决,一是将该文件的所有父目录的owner手动都修改为root;另一种方式就是在yarn-site.xml中配置yarn.nodemanager.linux-container-executor.path的值到自定义路径下,然后将该文件单独复制到该自定义路径下,然后仅修改该路径的权限为root即可。
Yarn在Capacity调度方式下使用GPU时,如果队列采用百分比配置会造成资源的浪费:假设共集群中共10块GPU,除非GPU队列配置100%,否则都会造成GPU的浪费。且Yarn目前不支持对GPU采用绝对值的配置(详见:https://issues.apache.org/jira/browse/YARN-9161),因此考虑采用混合配置,即CPU配置绝对值,GPU配置100%。
因此引入了Yarn的节点标签功能。
· 节点标签
节点标签有两种策略,分别是:
· Exclusive: 分区内的资源完全独立,不会分配给其他的分区;
· Non-exclusive: 分区内的资源可以向CPU分区共享。
本文结合实际业务场景,介绍了Yarn的部分高级功能,除本文所描述的功能外,Yarn还有更多其他的高级功能,例如Yarn还支持在Docker容器中运行作业、支持对FGPA设备的管理等,尽管Yarn作为分布式资源调度框架已经十分出色,但是在docker容器的调度方面确不如k8s,因此我们在生产中可以根据实际业务需求来进行技术选型。