导语 |?传统HADOOP生态系统使用YARN管理/调度计算资源,该系统?般具有明显的资源使?周期。实时计算集群资源消耗主要在?天,而数据报表型业务则安排在离线计算集群中。离在线业务分开部署的首要问题就是资源使用率低,消耗成本?。随着业务的增?和突发的报表计算需求,为了解决为离线集群预留资源,腾讯云EMR团队和容器团队联合推出Hadoop Yarn on Kubernetes Pod,以提?容器资源使用率,降低资源成本,将闲时容器集群CPU使?率提升数倍之多。本文主要介绍HADOOP资源调度器YARN在容器环境中的优化与实践。
一、Hadoop Yarn on Kubernetes Pod 混合部署模式
Hadoop Yarn on Kubernetes Pod 方案提供弹性扩缩容和离在线混合部署两项功能。弹性扩缩容主要聚焦于如何利?云原生资源,快速扩容资源以补充算力。离在线混合部署模式的目的是为了充分使用在线集群的空闲资源,尽可能减少为离线集群预留空闲资源的频次。
EMR弹性扩缩容模块(yarn-autoscaler)提供按负载和按时间弹性伸缩两种扩缩容方式。对于按负载伸缩,用户可以对不同指标设置阈值来触发扩缩容,比如设置Yarn队列中availablevcore、 pending vcore、available mem、pending mem。亦可以使用时间扩缩规则,按天、按周、按月等规则指定触发。
通过该方案,Yarn的NodeManager服务可以快速部署到POD节点中。但也Yarn原生调度没有考虑异构资源,由此引发了两个问题:
1. AM的POD被驱逐,导致APP失败
在node节点的资源紧缺的条件下,kubelet为了保证node节点的稳定性,会触发主动驱逐pod的机制。如果该节点存在AM服务,则整个Application就要被视为失败,ResourceManager此时会重新分配AM。对于计算量很大的任务,Application重跑的代价不可承受。
2. Yarn原生非独占分区资源共享局限性
Yarn的标签分区特性?持独占分区(Exclusive),非独占分区(Non-exclusive)。?
但是在实际使?场景中,?户要给各个业务部门分配各自的独占分区资源,同时会划分出供各部门使用的default分区。default分区资源会比较充足,业务部门希望能够使用自己的独占分区和同时充分利用default分区资源,独占分区资源和default分区都不够用的时候,才会触发弹性扩容,往属于自己的独占分区中扩容资源。
二、对Yarn改造带来的挑战
目前Yarn的社区没有考虑云上异构资源混合部署的特点。在线TKE集群中,当资源紧张时会对容器进行驱逐。为了避免Appliction重新计算,浪费资源的现象,必须提供AM可以指定能否分配到POD 类型资源。
自主选择存储介质中,使用配置化标识,由NodeManager通过RPC上报能否将资源提供给AM使用,ResourceManager通过上报信息决定将Application的AM分配到稳定资源介质中。由NodeManager通过配置化上报信息的好处是显而易见的:
Yarn的原生标签设计中,提交任务时的标签表达式中只能含有单个标签。如果为了提?利用率,同时使用多个分区资源,就必须将非default分区设置为Non-exclusive特性。标签表达式必须解决如下三个问题:
腾讯云EMR团队通过支持扩展表达式语法,增加对逻辑运算符表达式的支持,使App可以申请多个分区资源。同时开发资源统计模块动态统计分区可用资源,为App分配最合适的分区。
三、实操演练
测试环境:指定172.17.48.28/172.17.48.17的NodeManager为default分区,172.17.48.29/172.17.48.26的NodeManager为x分区。
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>yarn.scheduler.capacity.root.queues</name><value>a,b</value></property> <property><name>yarn.scheduler.capacity.root.accessible-node-labels.x.capacity</nam e><value>100</value></property> <property><name>yarn.scheduler.capacity.root.accessible-node-labels.y.capacity</nam e><value>100</value></property> <!-- configuration of queue-a --><property><name>yarn.scheduler.capacity.root.a.accessible-node-labels</name><value>x</value></property> <property><name>yarn.scheduler.capacity.root.a.capacity</name><value>50</value></property> <property><name>yarn.scheduler.capacity.root.a.accessible-node-labels.x.capacity</n ame><value>100</value></property> <!-- configuration of queue-b --><property><name>yarn.scheduler.capacity.root.b.accessible-node-labels</name><value>y</value></property> <property><name>yarn.scheduler.capacity.root.b.capacity</name><value>50</value></property> <property><name>yarn.scheduler.capacity.root.b.accessible-node-labels.y.capacity</n ame><value>100</value></property> </configuration>
1. 规定AM只能分配在172.17.48.28
对另外三个节点的NodeManager节点配置如下配置项:
yarn.nodemanager.am-alloc-disabled = true
配置后,提交的Application的AM只能在172.17.48.28节点启动。
2. 使用组合标签
通过mapreduce.job.node-label-expression指定标签表达式,x||表示同时使用x/default分区。
hadoop jar /usr/local/service/hadoop/share/hadoop/mapreduce/hadoop-mapredu ce-examples-3.1.2.jar pi -D mapreduce.job.queuename="a" -D mapreduce.job. node-label-expression="x||" 10 10
使用该命令提交后,观察到Application的container被分配在x/default分区。
四、Hadoop Yarn on Kubernetes Pod 最佳实践
基于Hadoop Yarn on Kubernetes Pod 方案,将离线任务自动扩容至云上集群,与TKE在线业务集群混合部署,充分利用云上波谷时段的闲置资源,提高离线业务的算力,并利用云上资源快速的弹性扩容能力,及时补充离线计算的算力。
通过Hadoop Yarn on Kubernetes Pod ?案对客户的在线TKE集群资源使用进行优化后,集群闲时CPU使用率能提高500%。
五、总结
作者简介
张翮,腾讯云高级工程师,目前主要负责腾讯云大数据产品弹性MapReduce的管控相关模块和重要组件Hive的技术研发。向Apache Hive,Apache Calcite开源项目贡献过代码,毕业于电子科技大学。
在Python开发过程中,我们难免会遇到多重条件判断的情况的情况,此时除了用很多...
背景 我们知道 如果在Kubernetes中支持GPU设备调度 需要做如下的工作 节点上安装...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
本文转载自微信公众号「bugstack虫洞栈」,作者小傅哥 。转载本文请联系bugstack...
近几年,互联网行业蓬勃发展,在互联网浪潮的冲击下,互联网创业已成为一种比较...
基本介绍 给定 n 个权值作为 n 个叶子节点,构造一颗二叉树,若该树的带权路径长...
TIOBE 公布了 2021 年 3 月的编程语言排行榜。 本月 TIOBE 指数没有什么有趣的变...
溢价 域名 的续费价格如何?通常来说,因为溢价域名的价值高于普通域名,所以溢...
前言 统计科学家使用交互式的统计工具(比如R)来回答数据中的问题,获得全景的认...
本文转载自公众号读芯术(ID:AI_Discovery)。 这一刻你正在应对什么挑战?这位前...