Yarn实现原理和管理是怎样的
这篇文章给大家介绍Yarn实现原理和管理是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
成都创新互联公司是专业的霍城网站建设公司,霍城接单;提供网站制作、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行霍城网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Yarn中对于CPU的管理使用了CGroup方案,即使用CGroup来对Yarn中Container的计算能力进行管理。RM中的调度器根据AM的资源请求分配相应数量资源的Container,主要包括内存和CPU两种资源,CPU的分配与内存的分配过程是一样的。小编着重讲解Container中CPU的管理。
Yarn中包含两类容器执行脚本,若想实现对CPU的控制,需要使用LinuxContainerExecutor.java来启动容器,默认的 DefaultContainerExecutor.java无法管理CPU,可以将配置文件中的yarn.nodemanager.Linux-Container-executor.resources-handler.class参数值设为org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler
LinuxContainerExecutor可以实现以容器所属用户的身份运行container,而默认的 DefaultContainerExecutor只能以普通管理员身份运行container。
首先我们需要关注配置文件中的两个参数,源码中配置文件的路径为hadoop-yarn-api\src\main\java\org\apache\hadoop\yarn\conf\YarnConfiguration.java
第一个参数表示该节点上可以分配给容器使用的CPU核数,用vcores表示,默认为8,yarn中之所以采用虚拟CPU来表示,是为了消除不同CPU性能之间的差异,默认1个物理CPU对应一个虚拟CPU,需要手工设置。
第二个参数表示节点上的CPU可以分配给所有容器的使用时间比例,默认为100%,即所有CPU的计算能力全部供Yarn使用。
还有一个参数是用来限制是否允许在CPU空闲时,可以将多余的计算能力分配给其他进程使用,默认允许,若设为TRUE,则会严格按照资源限制控制容器的CPU使用时间,该参数如下:
了解完几个主要参数后再来看一下容器的CPU使用是具体怎样控制的。
该控制逻辑代码在hadoop-yarn-server\hadoop-yarn-server-nodemanager\src\main\java\org\apache\hadoop\yarn\server\nodemanager\util\CgroupsLCEResourcesHandler.java文件中。
下面看一下几个关键的逻辑点:
这两个方法会分别在容器启动前和容器执行完后进行调用,具体的调用过程是在hadoop-yarn-server\hadoop-yarn-server-nodemanager\src\main\java\org\apache\hadoop\yarn\server\nodemanager\LinuxContainerExecutor.java中的launchContainer方法中进行调用的。
第一个方法主要用来设置容器的CPU使用限额,具体实现在setupLimits方法中:
这个方法首先获取Container中分配的虚拟CPU数量,接着创建CGroup的文件路径,即在CGroup路径中创建与CPU和容器名称相关的路径。在这个方法中可以看到有两种CPU的限制方式:
第一种是通过cpuShares参数,该参数其实就是依据容器中分配的虚拟CPU数量来计算使用时间的,比如容器A为1 vcores,容器B为2 vcores,则容器A和B在满负荷运行时可以使用的CPU配额为1:2,该配比是相对的,即若只有一个容器,则可以使用100%的CPU时间。这种方式在保证公平的情况下能更加充分利用资源。
第二种需要开启上述提到的cgroups.strict-resource-usage参数, 即设为TRUE,通过调用 getOverallLimits方法得到具体限额,然后将限额写入cfs_period_us和cfs_quota_us文件中,这种方式限制的是绝对使用时间,来看一下getOverallLimits方法:
这里涉及到了几个参数:
yarnProcessors:代表在某个节点上yarn中可使用的虚拟CPU数量, 最小不能低于0.01,该参数的值是通过在init方法中调用NodeManagerHardwareUtils.getContainersCores方法进行初始化的,即根据配置文件中设定的CPU分配比例来计算Yarn可用的CPU数量:
quotaUS:就是在一个时间周期内可使用的 cpu 时间。
periodUS:时间周期(每个cpu core)。
具体计算方式在getOverallLimits方法中:
quotaUS默认值为1000 * 1000,即1秒,periodUS默认值为(1000 * 1000/yarnProcessors)取整。
当yarnProcessors小于1时,quotaUS的值为 (periodUS * yarnProcessors)取整,但最小不能低于1000ms,periodUS的值为1000 * 1000,即1秒。
将这两个值返回并写入文件中。
当容器执行完毕时,会清理上面设置的CPU限额配置,具体实现在下面的方法中:
关于Yarn实现原理和管理是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
网站题目:Yarn实现原理和管理是怎样的
网页URL:http://scyanting.com/article/iijejo.html