原文作者:杨巍威
翻译:Fayson
译文修订:杨巍威
回顾:什么是YuniKorn Scheduler
Apache YuniKorn(Incubating)是一个独立的资源调度程序,旨在将针对大数据工作负载的高级调度功能引入容器化平台。具体可以参考前面的文章《YuniKorn:一个通用的资源调度程序》。
自上次发表介绍YuniKorn的文章后,我们很荣幸的宣布2020年1月,YuniKorn被Apache孵化器所接受!加入Apache Software Foundation可以帮助我们更好的扩展尚处于发展阶段的YuniKorn社区,同时可以吸引更多不同的贡献者/用户加入我们。如果您有兴趣,请访问Apache YuniKorn网站和Github仓库:
0.8.0版本的新特性
YuniKorn 0.8.0版本是一个重要的里程碑,已经在大规模生产/临时(production/staging)环境中测试了几个月。我们认为这是第一个稳定版本,鼓励用户可以使用这个版本。
在接下来的章节中,我们将讨论0.8.0的新特性和一些性能基准测试。
2.1 Dynamic Queue Management
使用此功能,用户可以通过设置放置规则(placement rules)来委派队列管理。
放置规则提供了一种简单的声明性方式来定义动态队列,该队列会被自动创建和删除。最简单的一个用例就是将命名空间(namespace)和队列设置为一对一,YuniKorn将为每个命名空间创建一个队列,参考:
使用这种方式,不需要其他设置即可在K8s集群上运行YuniKorn。
2.2 Natively support K8s operators (Pluggable Application Management)
YuniKorn现在可以支持各种K8s operators,这利用了pluggable application management的新特性:
这个版本也打包了Spark-k8s-operator(alpha),提供对其原生的支持:
借助Pluggable Application Management框架,YuniKorn可以轻松地与第三方K8s operator进行集成,例如Spark-k8s-operator,Flink-k8s-operator,Kubeflow等。
YuniKorn监视由这些operator定义的Custom Resource Definitions,
因此它可以无缝管理端到端的应用程序生命周期。
2.3 Resource Reservation
在这个版本中,YuniKorn社区重新设计了核心调度逻辑以包括资源预留(reservation)功能。在批量调度场景中,预留不仅可以避免大型/挑剔的资源请求被饿死,而且还可以避免队首阻塞(Head-of-line blocking, HOL)其他请求。调度程序会自动将队列和最适合节点上的资源为未完成的请求进行预留。
2.4 Pluggable Node Sorting Policies
关于Pod的分布式,YuniKorn中提供了2种内置节点排序策略。一个是FAIR,它会试图将Pod均匀地分配到每个节点上。另一个是BIN-PACKING,它尝试将Pod打包到最少数量的节点上。前一种适用于数据中心场景,它有助于平衡集群节点的压力。后者适合在云上使用,它可以在使用自动扩展时最大程度地减少节点实例的数量,以节省成本。节点排序策略是可插拔的,用户可以实现自己的策略并将其插入到调度程序。
2.5 Evaluation
为了验证YuniKorn的功能和性能,我们社区进行了一系列评估。所有测试均使用Kubemark完成,
该工具可帮助我们模拟大型K8s集群并运行实验性工作负载。这些测试共使用了18台裸金属服务器来模拟2000/4000节点。
2.5.1 Scheduler Throughput
在K8s上运行大数据批处理工作负载(例如Spark)时,调度程序的吞吐量是最主要考虑的问题之一。YuniKorn提供了许多优化措施来提高性能,例如完全异步的事件驱动系统和低延迟排序策略。下图通过将YuniKorn(红线)与K8s默认调度程序(绿线)进行比较,揭示了调度程序的吞吐量(通过使用Kubemark模拟环境,并启动50,000个具有异构资源请求的Pod)。
图表记录了所有Pod在集群上运行所花费的时间
2.5.2 Resource Fairness between queues
每个YuniKorn队列都有其保证的和最大的容量。当我们有很多作业提交到这些队列时,YuniKorn确保每个队列都能获得应用的份额。当我们监视这些队列的资源使用情况时,我们可以清楚地看到如何实施公平性:
我们在此集群上设置了4个异构队列,并针对这些队列提交了不同的工作负载。从图表中,我们可以看到队列资源几乎以相同的斜率增加,这意味着队列之间的资源是公平的。
社区使用和参与
在Cloudera,我们专注于将YuniKorn集成到各种Cloudera公有云产品中,同时我们也希望通过YuniKorn给大家在K8上运行大数据工作负载(例如Spark)带来一流的体验。
阿里巴巴一直是我们重要的社区成员之一。阿里巴巴的Flink团队正在积极将YuniKorn引入其大规模Flink集群,以解决至今尚无法解决的许多问题。
以下引用任春德(阿里巴巴实时计算开发经理)对Apache YuniKorn项目的评论:
“随着云原生和无服务计算的蓬勃发展,在K8的支持下,越来越多的大数据工作负载在阿里云中运行,以实现更好的部署和管理。我们发现使用现有的K8S调度在运行多租户大数据应用程序时存在较多的问题,比如多个租户之间没有公平性也没有配额管理,以及高并发工作负载时较低的调度吞吐量等。这些挑战通过YuniKorn都得到了很好的解决或者正在进行中(WIP),该项目的目的是建立一个具有精心设计架构的统一调度框架。因此,我们选择加入这个极具潜力的社区。
我们已经在多个K8S的测试集群中使用YuniKorn几个月,并且一直在与社区一起对其进行改进。我们计划在2020年第二季度将YuniKorn部署在一个数千节点的新生产集群中,以提供实时计算服务。该目标旨在处理2020年阿里巴巴双11这一全球最大的24小时在线购物活动。”
我们还获得了来自Microsoft,LinkedIn,阿里巴巴,苹果,腾讯,Nvidia等企业的大量帮助,以帮助并指导该项目的发展。对于YuniKorn 0.8.0发行版的贡献者,请参阅Apache YuniKorn发行公告。
接下来的计划
我们计划在2020年第三季度发布下一版本(0.9.0),v0.9计划的主要功能包括priority scheduling,gang scheduling等。有关未来版本的更多详细信息,请参阅YuniKorn路线图。
感谢
非常感谢对Apache YuniKorn(Incubating)社区做出贡献的每个人!该发行版是许多贡献者直接和间接努力的结果,有关贡献者和顾问的列表,请参阅Apache YuniKorn发布公告。
谢谢Vinod Kumar Vavilapalli帮助审阅/撰写此博客文章。
关于原文作者: