问题导读
1.本文讲了哪些配置项?
2.DistributedShell是否可以让用户指定网络带宽?
3.hadoop3.0网络设计存在哪些已知的问题?
接上篇
hadoop3.0 Yarn支持网络资源1:network设计文档说明【中文】
http://www.aboutyun.com/forum.php?mod=viewthread&tid=23653
配置选项
为了执行一些配置项将在NM上可用。
1.yarn.nodemanager.resource.network.interface管理员可以指定YARN使用的网络接口(以及正在运行的应用程序)。 流量整形规则应用于此接口。 如果可能的话,这是自动确定的,但在检测失败或未配置的情况下默认为eth0。
2.yarn.nodemanager.resource.network.outbound-bandwidth-mbit管理员可以在节点设置 yarn-site.xml有效带宽.如果可能,默认带宽将自动确定。如果无法确定,它将被设置为1000兆位/秒【1000 mbit/sec】的除非被管理员在yarn-site文件中配置重写覆盖。此值连同为Yarn容器分配的带宽(见下文)用于确定在YARN容器中不运行的进程的可用(保证)出站网络带宽的数量。 有关更多信息,请参阅NM启动部分。
3.yarn.nodemanager.resource.network.outbound-bandwidth-yarn-mbit管理员可以设置YARN containers最大的总的可用带宽,在yarn-site.xml文件中.如果没有指定,将会默认为yarn.nodemanager.resource.network.outbound-bandwidth-mbit的值
4.yarn.nodemanager.strict-resource-usage这是一个现有的配置参数,允许管理员指定允许的用法是“弹性的”还是“严格的”【‘elastic’ 或则‘strict’】。 如果没有启用严格的使用,每个YARN容器的网络带宽利用率被允许“burst’”达到yarn.nodemanager.resource.network.outbound-bandwidth-yarn-mbi值
验证配置——默认值和非默认值
配置在启动期间被验证(RM / NM)。 根据启用了网络调度的部署YARN的群集,默认配置可能无效(例如,eth0可能不是从属节点上的有效接口,或配置的最大接口带宽不正确)。 在这种情况下,默认值或指定的配置参数是无效的,网管将记录一个错误,并启动失败。
NM启动
一旦配置被验证,在NM启动期间执行以下操作:
1.安装net_clcgroup子系统
2.对于正在使用的网络接口,应用以下tc操作:
a.添加一个HTB队列规则(qdisc)[mw_shl_code=bash,true]tc qdisc add dev eth0 root handle 10: htb[/mw_shl_code]
b.对于队列规则添加一个顶层类
[mw_shl_code=bash,true]tc class add dev eth0 parent 10: classid 10:1 htb rate 1000mbit default 3[/mw_shl_code]
c.启用过滤器基于classid
[mw_shl_code=bash,true]tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup[/mw_shl_code]
现在附加两个类,一个用于容器容器的最大允许流量,另一个用于剩余的带宽(默认类3)。默认的类有一个允许ceil相应的接口maxbandwidth,允许它使用所有可用带宽,如果不使用的话。
[mw_shl_code=bash,true]tc class add dev eth0 parent 10:1 classid 10:2 htb rate 700mbit
tc class add dev eth0 parent 10:1 classid 10:3 htb rate 300mbit ceil 1000mbit[/mw_shl_code]
要执行TC操作,我们需要root权限。我们将修改containerexecutor.c允许此功能。
创建一个Ccgroup和分配一个classids到Container
创建一个cgroup(为net_cls子系统)为每一个容器,每个容器被分配一个唯一的(未使用的)classid,用于标记源自这个cgroup的数据包。 例如 :[mw_shl_code=bash,true]mkdir /cgroup/net_cls/container_1
echo $PID >> /cgroup/net_cls/container_1/tasks
echo 0x100007 > /cgroup/net_cls/container_1/net_cls.classid[/mw_shl_code]
该功能将作为CGroupsLCEResourceHandler类的一部分来实现。
将基于classid的流量整形规则应用于指定的接口
一旦对容器进行cgroup相关的更改,具有所需速率的类就需要应用于htb树。 这里使用的classid需要与写入net_class.classid文件的classid相同。 取决于是否启用了严格的强制执行,还配置了“ceil”突发速率:
[mw_shl_code=bash,true]tc class add dev eth0 parent 10: classid 10:7 htb rate 50mbit ceil 700mbi[/mw_shl_code]
如上所述,containerexecutor.c将修改以添加对此功能的支持。
资源本地化,Shuffle,,日志聚合,HDFS
NM提供的某些共享服务可能会消耗大量的网络带宽,如资源本地化,日志聚合和shuffle.。 由于这些服务是由NM本身提供的,所以我们不能对它们应用容器特定的限制。 同样的问题也适用于HDFS。
有两个潜在的解决方案(在Linux上)
1.在一个CGroup(和一个关联的tc规则)下运行一个新的NM 配置参数控制NM可用的带宽量。 由于这将限制可用于NM的带宽量(否则,其不可用),所以可能会导致性能下降。 在这种情况下,HDFS带宽利用率(例如服务远程读取)仍将不受限制。
2.在顶层HTB qdisc之下创建两个子层次结构.一个用于 YARN容器和一个用于其它每一个。 这将保证带宽的操作,如shuffle,,日志聚合,同时允许这些操作比保证的消耗更多的带宽,如果可用的话。 这种方法的意义在于,在YARN容器的高网络利用率的情况下,shuffle,对数聚集,HDFS读取(服务)可以被限制到较小的带宽量。 本文档的NM启动部分假设我们将使用这种方法。
一个更好的长期解决方案可能是在YARN容器中产生logaggregation和shuffle作为微服务,然后我们可以应用容器特定的限制,如本文所述。
其它
RM和NM将不得不进行修改以启用网络的计费(计费)。 此功能目前为内存和CPU启用。 为了列出可用/分配的网络带宽,还需要一些UI更改。
MapReduce, DistributedShell
MapReduce和DistributedShell都将被修改,将网络视为资源。 在MapReduce的情况下,将添加作业配置选项来设置map和reduce任务所需的网络带宽。 在分布式shell的情况下,将添加命令行选项以允许用户指定网络带宽。
已知的问题
1.目前的执行机制只有Linux。
2.在Linux上,目前的执行机制只支持出口的流量整形。 入口流量不能以相同的方式成形。 这意味着从YARN容器读取远程HDFS不会受到限制。 然而,HDFS写入会受到限制。
3.如果是多宿主环境,管理员将不得不明确地设置网络接口在NM配置。 如果这个接口设置不正确,结果会是执行可能不正确。
翻译:官网network文档,如有更好的理解或则建议,欢迎大家讨论
更多信息关于net_cls 和 classids,查阅:
https://access.redhat.com/documentation/enUS/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/secnet_cls.html
更多信息关于tc,查看
http://www.lartc.org/manpages/tc.txt
HTB和它的“borrowing”机制,详细介绍
http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm 和这里:
http://tldp.org/HOWTO/TrafficControlHOWTO/classfulqdiscs.html
|
|