2019 年 7 月 17 日,Cloudera 官方博客发文开源了一个内部研发使用很久的大数据存储和通用计算平台交叉的新项目 YuniKorn。Yunikorn 是一个新的独立通用资源调度程序,负责为大数据工作负载分配/管理资源,包括批处理作业和长时间运行的服务。
介绍
YuniKorn 是一种轻量级的通用资源调度程序,适用于容器编排系统(container orchestrator systems)。它的创建一方面是为了在大规模,多租户环境中有效地实现各种工作负载的细粒度资源共享,另一方面可以动态地创建云原生环境。 YuniKorn 为混合工作负载(mixed workloads)提供统一的跨平台调度体验,包括无状态批处理工作负载(stateless batch workloads)和有状态的服务(stateful services),支持 YARN 和 Kubernetes,同时也支持其他类似的系统。
YuniKorn 为混合工作负载提供统一的跨平台调度体验,包括无状态批处理工作负载和状态服务,支持但不限于 YARN 和 Kubernetes。YuniKorn['ju:nikɔ:n] 是一个虚构的词,"Y"代表 YARN,"K"代表 K8s,"Uni"代表统一,其发音与"Unicorn"相同。创建它是为了最初支持这两个系统,但最终目的是创建一个可以支持任何容器协调器系统的统一调度程序。
YuniKorn 目前有4个组件:
- yunikorn-scheduler-interface
- yunikorn-core
- yunikorn-k8shim
- yunikorn-web
下面我们将会深入讨论这些组件。
YuniKorn 诞生的背景
企业用户在不同的平台上运行工作负载,例如 YARN 和 Kubernetes。 他们需要使用不同的资源调度程序,以便其工作负载可以有效地在这些平台上运行。
目前,调度程序生态系统是分散的,并且从现有用例(如批处理工作负载)以及新需求(比如云原生架构(cloud-native architecture)、自动扩展等)来说,这种实现架构不是最优的,例如:
- YARN 具有批量工作负载的 Capacity Scheduler 和 Fair Scheduler;
- K8s 对服务具有默认的调度程序。对于批处理工作负载,社区有 Kube-batch,Poseidon,Rubix(Spark 的 Scheduler扩展)。
我们调查了这些项目,并意识到到目前为止还没有一个完美的方法来既支持无状态批处理作业(需要公平性,高调度吞吐量等)又支持长期运行服务(需要持久化以及复杂的条件约束等等)。这促使我们创建一个统一的调度框架来满足所有这些重要的需求,并使大数据和云原生社区受益,这就是 YuniKorn 诞生的背景。
YuniKorn 架构
在设计 YuniKorn 时,一个考虑到的目标是将调度程序与下面的资源管理系统分离。为此,我们创建了一个定义通信协议的通用调度程序接口。通过使用它,scheduler-core 和 shim 两个模块可以一起工作来处理调度请求。YuniKorn 组件的更多解释可以参考下面的介绍。下图是 YuniKorn 的系统架构。
YuniKorn 的主要模块介绍:
- 调度程序接口(Scheduler Interface):调度程序接口是资源管理平台(如 YARN/K8s )将通过诸如 GRPC/编程语言绑定之类的 API 与之交互的抽象层。
- YuniKorn Core:YuniKorn Core 封装了所有调度算法,它从底下的资源管理平台(如 YARN/K8s)收集资源,并负责资源分配请求。它决定每个请求的最佳位置,然后将响应分配发送到资源管理平台。 Scheduler core 模块与底层的平台无关,所有通信都通过 scheduler interface。
- Scheduler Shim Layers:Scheduler shim 在 YARN/K8s 内部运行,它负责通过 scheduler interface 转换主机系统资源和资源请求,并将它们发送到 scheduler core。当调度程序做出决策时,它负责实际的 pod/容器绑定。
- Scheduler UI:这个模块主要提供受管节点(managed nodes,),资源,应用程序和队列的简单 UI 界面。
YuniKorn 特性
以下是 YuniKorn 目前支持的特性:
- 调度功能支持批处理作业和长期运行/有状态服务;
- 具有最小/最大资源配额的分层池/队列;
- 队列,用户和应用程序之间的资源是公平的;
- 基于公平的跨队列抢占;
- 支持自定义资源类型(如GPU)调度;
- 支持丰富的编排约束(placement constraints support);
- 根据策略自动将传入的容器请求映射到队列;
- 使用专用配额/ACL管理将集群拆分成多个子群集。
如果在 K8s 上运行 YuniKorn ,还支持以下特定功能:
- 支持 K8s 谓词。如 pod affinity/anti-affinity,节点选择器;
- 支持 Persistent Volumes, Persistent Volume Claims 等;
- 从 configmap 动态加载调度程序配置(热刷新);
- 可以在 Kubernetes 之上部署。
YuniKorn Web支持监视调度程序队列,资源使用,应用程序等。
下一步
在单个系统上运行混合工作负载存在许多挑战,YuniKorn 是我们打算让这条路径更容易的选择。我们的目标是开始支持登陆现有K8群集的各种大数据工作负载。 我们正在努力更好地支持K8上的 Spark,Flink和Tensorflow等工作负载。
可以在此处找到项目 roadmap,我们最终的目标是为大数据和云原生世界带来最佳的调度体验。
YuniKorn 的项目地址 https://github.com/cloudera/yunikorn-core
本文翻译自:https://blog.cloudera.com/yunikorn-a-universal-resources-scheduler/
本博客文章除特别声明,全部都是原创!原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【YuniKorn: Cloudera 开源的可适配 YARN & K8s 的新一代资源调度器】(https://www.iteblog.com/archives/2582.html)