1 背景
随着公司这两年业务的迅速扩增,业务数据量和数据处理需要也是呈几何式增长,这对底层的存储和计算等基础设施建设提出了较高的要求。本文围绕计算集群资源应用和资源调度开展,将带大家理解集群资源调度的整体过程、面临的问题,以及咱们在底层所做的一系列开发优化工作。
2 资源调度框架 —Yarn
2.1 Yarn 的总体构造
从大数据的整个生态体系来说,hadoop 处于离线计算的外围地位。为了实现大数据的存储和计算,hadoop1.0 提供了 hdfs 分布式存储以及 mapreduce 计算框架,尽管整体具备了大数据处理的雏形,但还不反对多类型的计算框架,如起初的 spark、flink,这个时候也并没有资源调度的概念。
到了 hadoop2.0,为了加重单台服务节点的调度压力,兼容各个类型的调度框架,hadoop 抽离出了分布式资源调度框架 —YARN(Yet Another Resource Negotiator)。Yarn 在整个架构中所处的位置如图 1:
Yarn 通过优化后的双层调度框架,将 hadoop1.0 中本来须要执行资源调度和任务调度的单点 JobTracker 分为 Resourcemanager 和 ApplicationMaster 两个角色,别离负责集群总体的资源调度和单个工作的治理调度,而新增的 Nodemanager 角色负责各计算节点的治理。Yarn 工作提交流程如图 2:
客户端提交的工作理论由 Resourcemanager 间接解决,Resourcemanager 为每一个工作启动 ApplicationMaster,工作资源申请由 ApplicationMaster 间接负责,这样,各个框架通过实现本人的 ApplicationMaster 来治理工作,申请 container 作为资源,就能胜利在 yarn 集群将工作运行起来,资源的获取对工作齐全通明,工作框架和 yarn 齐全解耦。
2.2 Yarn 的调度策略
Yarn 对于工作的调度在开源版本实现了 3 种策略,别离为先进先出(FIFO Scheduler)、容量调度(Capacity Scheduler)和偏心调度(Fair Scheduler),通过社区版本演变,目前偏心调度曾经按队列级别实现了偏心机制,咱们集群采纳的正是偏心调度策略。
在理解几种调度策略之前咱们先了解一个概念:队列。在 Yarn 中,队列其实就是指资源池,如果把整个集群的资源看做大的资源池的话,Yarn 会依据用户配置把这个资源池进一步划分成小的资源池;父队列能够进一步向下划分,子队列会继承父队列的资源并且不会超过父队列的最大资源,整个资源队列的组织模式就像一颗多叉树。
先进先出和容量调度策略别离按工作提交程序和为工作划分队列的形式来组织工作,这两种形式对生产环境来说并不是非常实用,因为咱们的目标是让尽可能多的工作运行起来,并且尽量充分利用集群资源,而这两种策略别离会导致工作梗塞以及资源节约。
生产环境中的偏心调度遵循这样一种规定:保障工作资源分配的偏心,当小工作提交过去没资源时,调度器会将大工作开释的资源留给小工作,保障了不会让大工作始终占有资源不开释。三种调度策略的组织模式如图 3:
偏心调度除了上述所说保障工作间的资源偏心之外,还会动静调整队列大小,保障队列间的资源偏心,调整根据是集群实时负载,当集群闲时,队列根本能取得配置的最大资源值;当集群忙时,调度器优先满足队列最小值,满足不了时会依据配置的最小值等参数来平均分配。
2.3 Yarn 的联邦调度
在单个集群达到数千节点规模时,单台 Resourcemanager 理论曾经靠近了调度的性能瓶颈,要想进一步扩充集群规模社区给出的计划是通过联邦调度横向扩大。该计划的外围就在于 Router,对外,Router 提供了工作提交的对立入口;对内,Router 治理了多套集群,理论工作由 Router 负责转发,转发到哪个集群由 Router 来决定。Router 的理论工作流程如图 4:
能够看到,通过 Router 治理的联邦调度形式,集群的概念理论曾经对用户通明,并且在当某个集群呈现问题时,Router 能通过配置及时进行故障转移,将工作路由到衰弱的集群,从而保障了整体集群的对外服务稳定性。
3 OPPO 计算集群现状
3.1 集群规模和现状
通过两年多的集群建设,目前咱们的集群曾经达到了比拟可观的规模,在这样的集群规模下,保护稳定性其实是第一要务,咱们对集群做了不少稳定性方面的工作,如权限管控、各项重要指标监控等。
除了局部稳定性建设的工作之外,另一个重点关注的是集群资源使用率,以后大部分集群资源应用有比拟显著的周期性法则,从图 5 的集群监控能看出集群常常凌晨忙碌而白天绝对闲暇。
集群高峰期的资源缓和问题仅依附集群外部本身协调其实能获得的成果无限,咱们针对这种状况是思考在凌晨高峰期与 k8s 联结调度,将闲暇的在线资源协调局部到离线集群,后文将对该计划进行详细描述。
3.2 集群 pending 问题
除了高峰期的资源缓和,咱们发现在白天也会呈现队列工作大量 pending 的状况,咱们对具体的 pending 工作进行剖析,总结出了以下 3 种导致工作 pending 的问题:
- 队列配置不合理:
依据偏心调度机制,队列的实时可用资源很大水平由配置的最小值决定,某些队列配置的最小值过小或为 0 会间接导致队列无奈获取足够的资源。另外,如果队列配置的 CPU 和内存比例与理论执行的工作 CPU 内存比差距过大,也会导致资源有余工作无奈运行。 - 用户忽然向某一队列提交大量工作,资源使用量超出队列下限:
这种状况实际上与用户本身的应用无关,当本身的任务量加大后,向咱们提出申请来裁减队列是比拟适合的。 - 有大工作占住资源不开释,导致后续提交的工作申请不到启动资源:
Spark 或者 Flink 工作与传统的 Mapreduce 工作运行机制不太一样,这两类工作会长期占有资源不开释,导致新提交工作无奈及时获取到资源。针对该问题,咱们也设计了相应的资源抢占机制,后文详述。
总体来说,队列配置很大水平上影响了作业的运行,正当地优化配置往往能达到事倍功半的成果。
3.3 集群资源使用率现状
从上文看出监控中的集群大部分工夫都处于忙碌状态,然而咱们通过统计单台服务器的资源应用,发现还有很多资源的空余,如图 6 所示:
导致该问题的起因理论是用户作业申请的资源常常远超过理论须要的资源,咱们统计发现 95% 的 Container 理论利用率低于 76%,99% 的 Container 理论利用率低于 90%。表明作业申请的资源大小存在 ” 虚胖 ” 问题。这部分节约的资源如果能利用起来,其实能极大进步集群资源使用率。咱们针对这部分浪费资源的优化利用也会在后续一并探讨。
4 Yarn 的优化之路
4.1 Yarn 联邦调度的优化
社区的联邦调度计划对于咱们来说过于简略,只是实现了简略的加权随机路由。在后续打算中,咱们会把更多的资源接入路由集群中,Router 服务会提供对立个队列和工作治理,用户只须要把工作对立提交到 Router 集群,而不必关系具体到哪个集群。Router 会统计所有集群的状态和负载,寻找适合的资源调度给工作。
4.2 资源编配和超卖
资源变配和资源超卖的目标是为了晋升每个节点的理论资源应用效率。
资源变配:基于历史的统计值,在调度资源时,调整调配给 container 的资源更靠近 container 理论需要的资源。通过咱们的实际,资源变配能够晋升 10-20% 的资源应用效率。
资源超卖:每个 container 运行时,都会产生肯定的碎片,nodemanager 能够将本人治理资源碎片收集起来,插入一些额定的 container 下来。咱们打算通过一个额定的碎片调度器来实现这个过程,在碎片比拟多时,启动一些额定的 container,碎片如果缩小,这些额定 container 会被回收掉。
4.3 资源动静扩缩
为了解决资源波峰波谷的问题,咱们正在与云平台单干,实现一个在线离线资源的混部框架,通过错峰的资源调度,晋升资源的整体使用率。调度过程次要通过 Yarn Router 和 OKE 两个服务协调实现,在实时资源有闲暇而离线资源缓和时,Yarn 会向 OKE 申请资源,实时资源缓和时,OKE 会向 YARN 申请回收这部分资源。同时,咱们引入了自研的 Remote Shuffle Service 来晋升动静 Nodemanager 的稳定性。
4.4 工作优先级治理
在实际过程中,咱们发现用户工作会有显著的优先级区别,因而咱们打算实现一个基于优先级的偏心调度器,来保障高优先级工作的运行延时和效率。一个队列下的资源会优先保障高优先级工作,对立优先级的工作之间偏心分配资源。同时,咱们也实现了工作抢占性能,即便低级工作曾经拿到了资源,高级别工作也能够用抢占调度来强行获取资源。
4.5 队列权限治理
Oppo yarn 权限采纳神盾对立鉴权,每个用户组在神盾申请队列权限。用户通过 hive,livy,或者 flink 等客户端间接提交的工作,都会在神盾零碎上进行用户的认证和队列的鉴权,无权限的用户会被回绝拜访。
5 总结
本文次要介绍了 Yarn 的根本工作原理及 Yarn 在 OPPO 的落地实际,总体来说能够演绎为以下几点:
- Yarn 作为典型的双层调度架构,冲破了单层调度架构的资源和框架限度,使作业的运行和资源分配更加灵便。
- 如何优化作业 pending 与如何使资源利用最大化是所有调度零碎都会面临的问题,对此,咱们能够从本人零碎自身特点来剖析,寻找适宜本人的解决方案。咱们认为剖析能够基于现有的数据统计。
- 离线和在线业务的错峰个性决定了单项业务无奈充分利用所有服务器资源,通过适合的调度策略组织这些资源将会极大升高服务器老本。
作者简介
Cheng OPPO 后端工程师
次要负责 YARN 离线资源调度平台的开发和建设工作,对大数据根底平台的建设有较丰盛的教训。
Zhejia OPPO 高级数据平台工程师
次要负责 OPPO YARN 集群的开发和优化工作,在大数据计算任务调度方面有丰盛的教训。
获取更多精彩内容,请扫码关注 [OPPO 数智技术] 公众号