《04-美团大数据及机器学习基础设施云原生改造实践-吴通.pdf》由会员分享,可在线阅读,更多相关《04-美团大数据及机器学习基础设施云原生改造实践-吴通.pdf(54页珍藏版)》请在三个皮匠报告上搜索。
1、美团数据及机器学习集群云原改造实践 美团数据平台资源与系统负责/吴通录早期架构及升级背景 云原改造过程 关键问题和思考 未来规划改造前架构场景特点数据和机器学习两个场景,先有数据,后有机器学习 数据场景供需共构,对扩展性、可观测性等诉求不,机器故障率低 机器学习场景供需异构,对调度语义、扩展性、可观测性、运维友好均有诉求,机器故障率改造前痛点扩展App类型复杂度 依赖AM,户感知,影响资源统计 持GPU、RDMA、NPU等设备复杂度 调度策略定制成本 故障感知、监控、可观测平低更深层次的原因离线场景的路径依赖 架构变更带来的不确定性 K8S VS YARNYARN:分布式集群资源调度系统 K8
2、S:分布式集群操作系统,管理集群资源的,不仅仅是调度改造后架构录早期架构及升级背景 云原改造过程 关键问题和思考 未来规划控制改造内容概览组件改造内容简介etcd服务器和客户端均升级3.5.5,提升性能并修复单节点revision落后较多的问题kube-apiserver1.解决负载不均衡问题2.httplog获取userAgent可能触发map并发读写问题3.修复get&watch在apiserver_request_duration_seconds_bucket错误展示的问题controller-manager1.改造Endpoint Controller,以解决underlay CNI不
3、持ClusterIP service问题2.增强NodeLifecycle Controller处理Not Ready Node的能,降低节点不可对已有负载的影响Operator1.SparkOperator:解决spark on k8s,持spark 2.2和RSS2.TrainingOperator:解决TF、MPI、PyTorch on K8S,持容错3.AFOServingOperator:以PaaS式解决TF、PyTorch、Triton 推理 on K8S4.OrdinaryServingOperator:以类IaaS式管理在线服务5.Codelab Operator:以容器式给程
4、师提供开发实验环境 6.PrestoOperator:Presto cluster on K8S,持弹性容错调度器研调度器,持各种级特性,吞吐平较节点端改造内容概览组件改造内容简介物理机调整挂盘式,借助硬/软Raid解决kubelet不能管理多磁盘的问题kubelet1.卡、GPU亲和性持到PCIE级别2.持多卡Pod分配多IP3.不同作业采不同的oom处理策略4.改造static cpu manager,适配预留cpu核的绑核法5.修复系列导致kubelet不稳定的问题,如device权限、terminating pod、IP回收等问题device plugin1.gpu-device-pl
5、ugin持按卡类型汇报资源名2.gpu-device-plugin、rdma-device-plugin持更丰富的设备健康检查和异常处理机制3.gpu-device-plugin、rdma-device-plugin持PCIE级亲和策略4.npu-device-plugin持ring内npd1.增强节点异常检查功能,保证节点在运期环境是符合预期的2.包括CPU、GPU、卡等硬件环境,也包括存储系统、IP管理等软件环境络1.采underlay CNI,实现pod和集群外部络资源互联2.改造clusterIP service实现式,实现在underlay CNI的负载均衡案存储1.持访问HDFS,
6、主要解决从NameNode获取token和renew token,并存储到Pod内的问题2.持访问Dolphin FS,实现了套CSI Driver,采静态提供PV的式,并持件系统故障后可动恢复,不影响已有负载 3.持访问EBS,实现了套CSI Driver,采动态提供PV的式。来剥离解决实验开发场景的状态保存,以实现挂起恢复功能改造内容概览组件改造内容简介监控告警1.3分2副本Prometheus,3thanos,3thanos-ruler2.建设k8s_alert对接公司内部的告警系统3.建设raptor-adaptor,对接在线服务指标到公司内部中间件可观测1.主流志案般采消息队列实时收
7、集志,但解决不了时延、时序和丢失问题,对户troubleshooting影响很 2.研了套志案,基本思路是在每个节点部署简单的件服务器来读取running状态pod志,pod结束后持久化到s33.构建了套数据收集案,实时收集etcd和Prometheus等数据源的数据,并通过消息队列存储到持久化存储4.构建了数百张dashboard,描述系统的运状况和不同组件的内部细节,并借此指导各类优化作研调度器简介持多租户配额管理,持排队 集群唯调度器,持Gang Scheduling,租户间、租户内公平调度 持抢占式调度,配额之上增加弹性量,提升资源利率 持划分逻辑资源池,Pod适应优选策略,减少GPU
8、碎 持RDMA亲和性调度,更好地撑性能计算需求 完善的退避机制,持租户-Job-Pod多层级退避 调度吞吐300+pods/s租户-配额管理两级队列:队列:租户,队列:租户内细分,min:配额,max-min:弹性量 Pod划分:System Pod,User Pod(指定PodGroup),单调度器统调度 Gang Job:PodGroup唯映射个Gang Job,指定作业提交队列主流程OpenSession:从cache中复制Node、Queue、Job和Pod等对象,使调度流程锁化 AllcoateSystem:调度System Pod,优选过程,快速调度 PreAllocate:为上轮
9、抢占成功的User Pod分配节点,Gang Job遵循事务提交 Allocate:调度User Pod,搜索最优Node,Gang Job遵循事务提交,核流程 Preempt:为调度失败的User Pod抢占资源,Gang Job遵循事务提交,核流程 CloseSession:更新Job和Pod状态,记录event事件和监控指标数据 调度概述队列公平调度:配额满率低的队列优先 Gang Scheduling优先调度:未满Gang的Job优先 Job公平调度:Pod调度率低的Job优先,防个Job饿死其他Job 优先级调度:持队列内指定Job优先级、Job内指定Pod优先级 异构调度:持10+
10、种GPU卡型,持5+种命周期、特点不的任务 调度语义丰富:持k8s原调度语义,扩展了如适应聚集/均衡调度、RDMA络亲和调度等抢占概述队列max min即表示开启弹性调度,max-min部分的资源占在集群资源紧张时会被抢占 队列只在配额未满的情况下才能抢占,弹性量部分不通过抢占来满 公平性:和调度过程类似,优先为配额满率低的队列和Pod调度率低的Job发起抢占 优先级抢占:持队列内指定Job优先级、Job内指定Pod优先级,抢低优保优 Gang Scheduling保护:优先抢占每个Job超出minMember的Pod,如果Gang Scheduling被破坏,则抢占整个Job抢占关键实现-G
11、ang Scheduling Gang Scheduling:为Job分配于等于minMember数量的Pod 调度事务化,连续为Job调度够数量的Pod后提交调度结果,否则回滚 抢占分成两步,先尝试仅抢占超出minMember部分的Pod,再执Gang抢占抢占关键实现-两级事务控制为Gang Job发起抢占会有多个Preemptor,多个Preemptor抢占结果提交需要保证原性;每个Preemptor可能抢占Node上的多个Preemptee,多个Preemptee的抢占结果也需要保证原性。逻辑资源池划分核思想:刻画任务类型特征,在资源碎、可性、性能和可维护性之间找到平衡点 有状态的作业。
12、执迁移和运维动作困难,尽量聚集在批机器上 规模训练作业。单worker占据整机资源,集群需要预留些空载机器 多实例在线服务。将不同实例打散到不同机器,当节点故障时降低对服务的影响 在逻辑上分成 均衡池 和 聚集池。均衡池负责多实例应的容错和提升集群整体IO及络带宽,聚集池降低尺Pod的等待时间,并将有状态作业束缚在少量机器上。逻辑资源池只是种优选机制,当聚集池满了之后,聚集型的Pod也可以被调度到均衡池中,反之亦然。退避机制前提假设:轮调度失败的任务,在之后轮中概率还是失败 四级退避设计:指数退避算法,防”坏分”,减少调度器做谓调度,充分保证正常队列、任务的调度需求,在调度负载场景下可以显著提
13、升调度吞吐Codelab OperatorCodelab是基于容器实现的实验开发环境,定位于户进规模开发实验,提供隔离独的开发环境,持久化存储实验环境和数据,能快速启动和恢复 Codelab核功能:1)状态持久化,持挂起和恢复;2)资源监控;3)集成实验环境及WebIDE,如JupyterNotebook、PyCharm等 什么是CodelabCodelab系统架构1.Application应层:通过APIService暴露API给户,渲染Codelab yaml 2.Controller控制层:调谐PC的切为 3.Storage存储层:Codelab通过PVC挂载或客户端访问所需共享存储Co
14、delab Operator架构准备:前置准备作,如添加Finalizer,申请HDFS访问token等;创建Pod:根据podTemplate创建Pod及其相关资源 挂起和恢复:通过spec.pause标记挂起和恢复期望,挂起时删除Pod,恢复时重新创建Pod;同步集群外资源:对接公司内服务树系统,将Codelab注册到某个AppKey;删除和清理:清理效Codelab,从Appkey注销,并释放HDFS Token;更新状态:计算Codelab状态,并更新.status 通过容器共享挂载实现初始化容器件共享 使EBS存储持久化户开发环境,主要包括yum和pip包 使Dolphin FS储存
15、组内共享的数据和代码 pc-start.sh作为systemd服务初始化CodelabCodelab启动过程1.闲时动挂起Codelab,删除Pod,释放所占计算资源,保留PV 2.恢复时将重建Pod,重新挂载PV,恢复数据和环境挂起与恢复Dolphin FS接简介Host Path-CSI 租户录唯映射PV,静态绑定加速调度 多Dolphin FS集群动识别,业务感知 Pod粒度fuse,提升读写并发 Fuse进程位于物理机,升级CSI plugin不中断挂载 持挂载点异常检测和热恢复改造前痛点:机器上所有Pod共享同个挂载点,挂载进程异常影响所有Pod 客户端发重启,容器内的挂载点丢失,法
16、热恢复,只能重启容器 客户端升级等运维操作会导致挂载中断,常运维“战战兢兢”针对多集群挂载需求,每种上层作业引擎需要重复适配 租户挂载固定录,设计个租户唯映射个PV 预分发租户PVC和PV,并完成静态绑定,加速调度过程租户-PV映射机制多集群动识别 多集群的配置信息存到ConfigMap,并挂载到CSI Pod,持热更新 CSI通过PV中携带的租户信息定位数据所在Dolphin FS集群,并将对应集群挂载到PodPod Level Fuse 每个Pod都有独的Fuse进程,即使Fuse进程挂掉,也不影响其他Pod的正常读写 Fuse作过程涉及户态和内核态切换,般对IO的并发有所限制,独享Fus
17、e在并发IO时具有性能优势CSI Connector 如在CSI Pod中启动Fuse进程,container重建导致Fuse进程重启,稳定性差 借助csi-connector,将Fuse进程代理到物理机,交由systemd来管理,和CSI解耦挂载点检测和热恢复 挂载点可以恢复的核关键在于:Linux Mount Propagation。CSI双向传播挂载kubelet数据录,录的挂载/卸载操作会传播到宿主机 Pod使HostToContainer,可以将宿主机的挂载事件传播到容器志服务志架构简介 志收集 志访问实时收集不可改造成本:对多志缺乏持,改造成本很 收集链路的要求:收集链路,flue
18、ntbit-log-agent-kafka-es,该架构法解决收集时延、志丢失和失序的问题 离线式能较好解决问题志收集优化志挂载不同pod如何挂载不同录 通过改造kubelet持如下模式挂载如何感知何时上传S3 调整kubelet的ttl参数,Pod删除后保留分钟容器元数据,轮询docker接获取容器信息 兜底:从志路径还原Pod信息 志访问优化集群外部署 当节点故障,志服务通过Fail over机制访问集群外同等接提升访问成功率 前节点外部署可以避免约0.43%的访问失败SEEK接获取志 S3及本地件均提供seek接,可根据偏移量获取件内容,提升接效率训练整体流程作业概览作业资源监控作业志录
19、早期架构及升级背景 云原改造过程 关键问题和思考 未来规划规模集群关键问题与思考调度能 稳定性 资源效率调度能吞吐量、调度语义的权衡 命周期和是否有状态对运维的影响稳定性基础环境的可预期:标准定义、异常发现、异常处理和标准变更 组件稳定性:控制组件和节点组件 资源隔离和QoS:关键是场景需要资源效率提升效率的段运维提效,建设动投产、维修系统 异常检查、动恢复 降低节点级别异常频率:修复节点端各类问题、隔离系统和业务进程 节点/单卡故障动维修 故障效诊断、维修保有率通过抢占释放些租户暂时不使的资源 作业分级,空闲卡跑低优作业 跨集群跨卡型调度机制 混部调度率优化容器启动速度 全位的作业命周期异常为探测,治理不合理法 MPS、MIG、vGPU等单卡复技术 预测服务弹性伸缩 调度负载率未来规划完成数据离线和实时场景的云原改造 场景间混部提升资源效率 构建场景适配的调度能 持续提升稳定性和资源效率