扩展Yarn资源模型详解1

问题导读 1.countable资源是指哪些? 2.noncountable资源,本文列举了什么资源? 3.标签是否为资源? 4.如何实现扩展YARN资源模型? 概述 当前Yarn支持各种资源类型:比如: disk( YARN2139),https://issues.apache.org/jira/browse/yarn-2139 network( YARN2140), https://issues.apache.org/jira/browse/YARN-2140 和HDFS bandwidth( YARN2681).https://issues.apache.org/jira/browse/YARN-2681 本文档提出了将YARN资源模型扩展为更加灵活的模型,使其更容易添加新的countable类型的资源。它还考虑了“resource profiles”的相关方面,这些资源配置文件允许用户容易地指定它们需要的容器资源。当添加对新资源类型的支持时,有两个方面需要考虑调度和隔离。 本文档仅涉及调度方面。 背景 在YARN中添加一个新的countable资源类型是一个相当复杂的过程。 需要进行大量的工作来修改ProtocolBuffers文件以及相应的Java源代码。 这必须通过修改 DominantResourceCalculator类添加对新资源类型的支持。 另外,许多不相关的测试用例都必须修改,因为他们使用了esource.newInstance(memory,,vcores))函数。此外,大多数新的资源类型被视为相同,只是名称不同而已。 总而言之,需要修改37个源文件来增加对新磁盘资源类型的支持;而对于未来的资源类型,类似的(可能更大的)将不得不进行修改,而且大部分更改将与之前的更改相同, 唯一的区别是变量的名称。 我们建议更改资源模型以支持可由群集管理员定义的任意、countable资源。 当我们谈到countable资源时,我们指的是资源的分配和释放是一个简单的减法和加法操作的资源类型。 我们不会在此版本的文档中涵盖专用资源,如端口【ports】或不可数量【noncountable】的资源(如标签)。 然而,我们的建议并没有排除增加对标签等资源类型的支持,这种工作可以作为未来工作的一部分来进行。 扩展YARN资源模型 ResourceManager 在我们提出的模型中,我们添加一个新的配置文件“resourcetypes.xml“,管理员可以使用它来添加新的资源类型。 ResourceManager(RM)“resource-types.xml”来确定启用调度的资源类型集合。 这些配置可以在yarn-site.xml配置,但是在一个单独的文件中指定它们可能会更清晰。 资源配置文件必须包含内存和vcore作为资源类型以防止功能的任何损失。 管理员可以添加任意新的资源类型,只要他们代表的资源是countable。 resource-types.xml样例如下

[XML] 纯文本查看 复制代码

?

<configuration>
<property>
<name>yarn.scheduler.resourcetypes</name>
<value>memory,cpu</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.memory.name</name>
<value>yarn.io/memory</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.memory.units</name>
<value>MB</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.memory.type</name>
<value>countable</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.memory.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.cpu.name</name>
<value>yarn.io/cpu</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.cpu.units</name>
<value>vcores</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.cpu.type</name>
<value>countable</value>
</property>
<property>
<name>yarn.scheduler.resourcetypes.cpu.enabled</name>
<value>true</value>
</property>
<configuration>

“yarn.io/memory”和“yarn.io/cpu”映射到YARN当前支持的现有内存和vcore资源类型。 资源名称与Kubernetes资源模型中的资源名称相似(链接位于参考部分)。 NodeManager 类似的,我们建议添加一个新的文件“nodere-sources.xml“,来指定节点的资源使用量。跟“resource-type.xml”类似,这些配置可以在yarn-site.xml文件中设置。但是在单独的文件中指定它们可能会更清晰。 下面是node-resources.xml样例

[XML] 纯文本查看 复制代码

?

<configuration>
<property>
<name>yarn.nodemanager.resourcetypes</name>
<value>memory,cpu</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.memory.name</name>
<value>yarn.io/memory</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.memory.units</name>
<value>MB</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.memory.type</name>
<value>countable</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.memory.available</name>
<value>32</value>
<property>
<name>yarn.nodemanager.resourcetypes.cpu</name>
<value>yarn.io/cpu</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.cpu.units</name>
<value>vcores</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.cpu.type</name>
<value>countable</value>
</property>
<property>
<name>yarn.nodemanager.resourcetypes.cpu.available</name>
<value>8</value>
</property>
<configuration>

NodeStatusUpdaterImpl类将被修改为报告“noderesources.xml”文件中指定的所有资源的值,而不仅仅是当前的内存和CPU Resource类和DominantResourceCalculator 建议在Yarn的资源模型添加新的函数。

[Bash shell] 纯文本查看 复制代码

?

public static Resource newInstance(Map<ResourceTypeInformation, Long>
resources)

弃用

[Bash shell] 纯文本查看 复制代码

?

public static Resource newInstance(int memory, int vcores)

ResourceTypeInformation类的定义是:

[Bash shell] 纯文本查看 复制代码

?

public class ResourceTypeInformation {
URI name;
String units;
ResourceTypes type;
Boolean enabled;
}

其中resource-types是可能资源类型的枚举(“countable”“是目前唯一支持的类型)。 另一个限制是“name”字段必须是唯一的。 name字段将作为标识符。 这是为了避免两个资源类型具有相同的名称但不同的单位或类型而导致混淆的情况。 “enabled””字段允许管理员轻松启用或禁用资源类型。 目前,“units”字段有两个目的: 1.它将在NM注册期间使用,以确保RM和NM使用相同的单元。 2.文档 ProtocolBuffers定义的相应改变是:

[Bash shell] 纯文本查看 复制代码

?

enum ResourceTypes {COUNTABLE = 0;
}
message ResourceMapEntry {
string key = 1;
int64 value = 2;
string units = 3;
ResourceTypes type = 4;
}
message ResourceProto {
optional int32 memory = 1;
optional int32 virtual_cores = 2;
optional repeated ResourceMapEntry resource_value_map = 3;
}

当NM向RM注册时,如果“resourcetypes.xml”中列出的资源类型与NM报告的资源(缺少资源类型,附加资源类型,不匹配单元,不匹配类型等)不匹配,则会引发异常 NM关闭。 应该注意的是,“noderesources.xml”没有“enabled”字段。 这是因为如果一个资源类型被启用或者不启用,那么它应该与NM无关。 存在的内存和CPU资源类型将分别映射到“yarn.io/memory”和“yarn.io/cpu”。 为了保持兼容性并确保功能没有丢失,“yarn.io/memory”和“yarn.io/cpu”将被指定为强制资源类型。 使用URI作为资源类型名称的决定是从Kubernetes派生的,它建议使用符合RFC 1123的域后跟“/”后,跟一个名称。 已经存在的Resource.newInstance(int memory, int vcores) 函数,将会改变切换为Resource.newInstance(Map<ResourceTypeInformation, Long>)函数。已经存在的getMemory(), setMemory(int memory), getVirtualCores(), setVirtualCores(int vCores) 函数。行为没有任何的变化,可以继续工作。在内部,这些调用将被映射为读/写“yarn.io/memory”和“yarn.io/cpu”元素。 Resource类中的hashCode函数将不得不进行修改,以考虑所有的资源类型。 DominantResourceCalculator将改变为执行具有在Map<ResourceTypeInformation, Long>中启用标志设置的每个资源类型的计算,而不是当前命名变量。 NodeStatusUpdaterImpl 今天,NMs将资源报告给NodeStatusUpdaterImpl中的RM。 一旦我们允许任意资源类型,NodeStatusUpdaterImpl将不得不读取“node-resources.xml”文件并报告在该文件中设置的资源值。 另外,可能会出现资源类型值的情况.需要访问节点资源(如/ proc文件系统)。 为了达到这个目的,我们需要修改NM来允许插件读取和处理这些信息。 目前,我们不打算为此增加支持。 但是,如果有强烈需求,必须加以支持,我们愿意接受。 添加或删除资源类型 由于新的配置文件和建议系统的结构方式,在添加或删除资源类型时,操作顺序非常重要。 当添加新的资源类型时,必须首先升级NM,然后再升级RM。 这就允许NM向RM注册而不会导致不匹配。 相反,在删除资源类型时,必须首先升级RM(删除资源类型),然后是NM。 RegisterApplicationMasterResponse 目前,我们在RegisterApplicationMasterResponse调度器中有一个字段resource_types可以被应用程序用来确定资源类型被RM用于调度。 但是,这个领域目前是一个枚举。我们建议弃用这个字段,并添加一个新的字段“scheduler_resource_types_info”,它将包含所有的信息为调度启用的资源类型。 建议的修改如下:

[Bash shell] 纯文本查看 复制代码

?

message RegisterApplicationMasterResponseProto {
optional ResourceProto maximumCapability = 1;
optional bytes client_to_am_token_master_key = 2;
repeated ApplicationACLMapProto application_ACLs = 3;
repeated ContainerProto containers_from_previous_attempts = 4;
optional string queue = 5;
repeated NMTokenProto nm_tokens_from_previous_attempts = 6;
// scheduer_resource_types is deprecated
repeated SchedulerResourceTypes scheduler_resource_types = 7;
repeated ResourceMapEntry sceduler_resource_types_info = 8;
}

将以下API添加到RegisterApplicationMasterResponse类:

[Bash shell] 纯文本查看 复制代码

?

public abstract Map<URI, ResourceTypeInformation>
getSchedulerResourceTypesInformation();
public abstract void setSchedulerResourceTypesInformation(Map<URI,
ResourceTypeInformation>);

我们建议弃用

[Bash shell] 纯文本查看 复制代码

?

public abstract EnumSet<SchedulerResourceTypes>
getSchedulerResourceTypes();

[Bash shell] 纯文本查看 复制代码

?

public abstract void
setSchedulerResourceTypes(EnumSet<SchedulerResourceTypes> types);

本文分享自微信公众号 - about云(wwwaboutyuncom)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Fetch开发指南

在 Web 应用中,JavaScript 通过 XMLHttpRequest (XHR)来执行异步请求,这是一种有效改进页面通信的技术,当我们谈及Ajax技术的...

225100
来自专栏古时的风筝

mybatis Generator生成代码及使用方式

为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,ORM 的出现就是为了简化开发。最初的开发方式是业务逻辑和数据库查询逻辑是分开的,...

27290
来自专栏python学习指南

Python爬虫Scrapy(二)_入门案例

本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构...

22460
来自专栏抠抠空间

网络爬虫之scrapy框架设置代理

17230
来自专栏生信宝典

关于Python中的__main__和编程模板

在python程序中经常可以看到 if__name__ == ' _ _ main _ _'的判定,下面来解释下。 首先在python交互式界面中输入以下程序,...

441100
来自专栏北京马哥教育

用Python爬下十几万本小说,再也不会闹书荒!

自从看了师傅爬了顶点全站之后,我也手痒痒的,也想爬一个比较牛逼的小说网看看,于是选了宜搜这个网站,好了,马上开干,这次用的是mogodb数据库,感觉mysql太...

18640
来自专栏黑泽君的专栏

windows系统下VS2013或者VS2017的C4996错误解决方法

由于微软在VS2013中不建议再使用c的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令...

11720
来自专栏信安之路

XPath注入:攻击与防御技术

相信大家都非常熟悉 “注入” 这种攻击方式。 “注入” 这种攻击方式被列为了 OWASP 十大攻击的榜首。然而,本文所要讲述的不是被人熟知的SQL 注入攻击。而...

20300
来自专栏北京马哥教育

用Python爬下十几万本小说,再也不会闹书荒!

自从看了师傅爬了顶点全站之后,我也手痒痒的,也想爬一个比较牛逼的小说网看看,于是选了宜搜这个网站,好了,马上开干,这次用的是mogodb数据库,感觉mysql太...

37950
来自专栏大数据-Hadoop、Spark

Logstash简单使用

Logstash-控制台输入输出 cd logstash-2.4.1 bin/logstash -e 'input { stdin { } } output ...

38290

扫码关注云+社区

领取腾讯云代金券