热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:腾讯云EMR基于YARN针对云原生容器化的优化与实践

篇首语:本文由编程笔记#小编为大家整理,主要介绍了腾讯云EMR基于YARN针对云原生容器化的优化与实践相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了腾讯云EMR基于YARN针对云原生容器化的优化与实践相关的知识,希望对你有一定的参考价值。







导语 | 传统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。亦可以使用时间扩缩规则,按天、按周、按月等规则指定触发。


当弹性规则被触发后,离在线部署模块获取当前在线TKE集群中可以提供的闲置算力的规格及数量,调用Kubernetes api创建对应数量的资源,ex-scheduler扩展调度器确保Pod被创建在剩余资源更多的节点上,该POD负责启动YARN的服务。



通过该方案,Yarn的NodeManager服务可以快速部署到POD节点中。但也Yarn原生调度没有考虑异构资源,由此引发了两个问题:


1. AM的POD被驱逐,导致APP失败


在node节点的资源紧缺的条件下,kubelet为了保证node节点的稳定性,会触发主动驱逐pod的机制。如果该节点存在AM服务,则整个Application就要被视为失败,ResourceManager此时会重新分配AM。对于计算量很大的任务,Application重跑的代价不可承受。


2. Yarn原生非独占分区资源共享局限性


Yarn的标签分区特性⽀持独占分区(Exclusive),非独占分区(Non-exclusive)。 


  • 独占分区(Exclusive):例如指定独占分区x,Yarn的container只会分配到该x分区。

  • 非独占分区(Non-exclusive):例如非独占分区x,x分区的资源可以共享给default分区。

    只有当指定分区default时,default上运⾏的Application可以使⽤分区x的资源。



但是在实际使⽤场景中,⽤户要给各个业务部门分配各自的独占分区资源,同时会划分出供各部门使用的default分区。default分区资源会比较充足,业务部门希望能够使用自己的独占分区和同时充分利用default分区资源,独占分区资源和default分区都不够用的时候,才会触发弹性扩容,往属于自己的独占分区中扩容资源。


二、对Yarn改造带来的挑战


对上述feature的开发,除了需求技术本⾝的难度。还需要考虑到尽可能降低用户存量集群稳定性的影响,减少用户业务侧改造成本。


  • 集群稳定性:Hadoop Yarn作为大数据系统中的基础调度组件,如果改动过多,引发的故障几率就会增大。同时引入的feature,必然需要升级存量集群的Haoop Yarn。升级操作要做到对存量业务集群无感知,不能影响到当天的业务。

  • 业务侧使用成本:引入的新feature也必须符合原⽣yarn的使用习惯,方便业务侧用户理解,同时降低业务侧对代码的改造。


1. AM自主选择存储介质


目前Yarn的社区没有考虑云上异构资源混合部署的特点。在线TKE集群中,当资源紧张时会对容器进行驱逐。为了避免Appliction重新计算,浪费资源的现象,必须提供AM可以指定能否分配到POD 类型资源。


自主选择存储介质中,使用配置化标识,由NodeManager通过RPC上报能否将资源提供给AM使用,ResourceManager通过上报信息决定将Application的AM分配到稳定资源介质中。由NodeManager通过配置化上报信息的好处是显而易见的:


  • 去集中化:减少ResourceManager处理逻辑。否则,扩容资源时,还需将资源信息通过RPC/配置流入到ResourceManager中。如无必要,勿增实体,对ResourceManager的改造应该轻量化。

  • 集群稳定性:存量业务集群对Yarn升级后,需要重启NodeManager, 只需要重启ResourceManager。Yare的高可用特性可保证升级过程对业务无影响。无需重启NodeManager 的原因是,NM默认将本机资源视为可分配。

  • 简单易用:用户可以通过配置⾃由决定任务资源拥有分配AM的权利,不单单局限POD容器资源。



2. 多标签动态分配资源


Yarn的原生标签设计中,提交任务时的标签表达式中只能含有单个标签。如果为了提⾼利用率,同时使用多个分区资源,就必须将非default分区设置为Non-exclusive特性。标签表达式必须解决如下三个问题:


  • 资源隔离:分区A设置Non-exclusive后,资源被其他分区上的APP占用后,无法及时交换给分区A的App。

  • 自由共享资源:只有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分区。



队列设置:






yarn.scheduler.capacity.root.queues
a,b



yarn.scheduler.capacity.root.accessible-node-labels.x.capacity
100



yarn.scheduler.capacity.root.accessible-node-labels.y.capacity
100




yarn.scheduler.capacity.root.a.accessible-node-labels
x



yarn.scheduler.capacity.root.a.capacity
50



yarn.scheduler.capacity.root.a.accessible-node-labels.x.capacity
100




yarn.scheduler.capacity.root.b.accessible-node-labels
y



yarn.scheduler.capacity.root.b.capacity
50



yarn.scheduler.capacity.root.b.accessible-node-labels.y.capacity
100




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 最佳实践





该客户大数据应用和存储跑在Yarn管理的大数据集群,在生产环境中,面临诸多问题,主要体现在大数据的算力不足和在线业务波谷时资源的浪费。如离线计算在算力不足时,数据准时性无法得到保证,尤其是当遇到随机紧急大数据查询任务,没有可用的计算资源,只能停掉已有的计算任务,或者等已有任务完成,⽆论哪种⽅式,总体任务执行的效率都会大打折扣。


基于Hadoop Yarn on Kubernetes Pod 方案,将离线任务自动扩容至云上集群,与TKE在线业务集群混合部署,充分利用云上波谷时段的闲置资源,提高离线业务的算力,并利用云上资源快速的弹性扩容能力,及时补充离线计算的算力


通过Hadoop Yarn on Kubernetes Pod ⽅案对客户的在线TKE集群资源使用进行优化后,集群闲时CPU使用率能提高500%。



在线集群闲时CPU占用



离在线混部后CPU占用


五、总结


本文提出了基于YARN针对云原生容器化的优化与实践,在混合部署云原生环境中,极大地提高了任务运行的稳定性,高效性,有效提高了集群资源利用率,节约硬件成本。在未来,我们会探讨更多大数据云原生场景,为企业客户带来更多的实际效益。


作者简介


张翮,腾讯云高级工程师,目前主要负责腾讯云大数据产品弹性MapReduce的管控相关模块和重要组件Hive的技术研发。向Apache Hive,Apache Calcite开源项目贡献过代码,毕业于电子科技大学。


点击文末「阅读原文」,了解腾讯云弹性 MapReduce更多信息~


腾讯云大数据



长按二维码
关注我们





推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
author-avatar
周同学天天爬十楼7634
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有