Spark on Kubernetes:Apache YuniKorn如何提供帮助

2020-10-29 10:01:45 浏览数 (1)

背景

为什么为Apache Spark选择K8

Apache Spark在一个平台上统一了批处理、实时处理、流分析、机器学习和交互式查询。尽管Apache Spark提供了许多功能来支持各种用例,但它为集群管理员带来了额外的复杂性和较高的维护成本。让我们看一下底层资源协调器的一些高级要求,以使Spark成为一个平台:

• 容器化的Spark计算可在不同的ML和ETL作业之间提供共享资源

• 支持在共享K8s集群上的多个Spark版本、Python版本和版本控制的容器,以实现更快的迭代和稳定的生产

• 单一、统一的基础架构,可同时处理大多数批处理工作负载和微服务

• 共享集群上的细粒度访问控制

与其他资源协调器相比,Kubernetes作为事实上的服务部署标准可在所有上述方面提供更好的控制。Kubernetes提供了一种简化的方法来管理基础架构和应用程序,并提供了一种实用的方法来隔离工作负载、限制资源的使用、按需部署资源以及根据需要自动扩展功能。

运行Apache Spark on K8S调度的挑战

Kubernetes默认调度程序在高效调度批处理工作负载方面存在差距,该集群中还将调度长期运行的服务。由于所需的计算并行性,批处理工作负载大多需要一起调度,并且需要更频繁地调度。让我们详细看看其中的一些差距。

缺乏一流的应用概念

批处理作业通常需要根据容器部署的类型按顺序安排。例如,Spark驱动程序pod需要比工作程序pod更早地调度。一个清晰的一流应用程序概念可以帮助对每个容器部署进行排序或排队。同样,这样的概念有助于管理员可视化计划用于调试目的的作业。

缺乏有效的容量/配额管理能力

在多租户用例中运行Kubernetes工作负载时,可以使用Kubernetes命名空间资源配额 来管理资源。但是,实现这一目标有一些挑战:

1) 就其资源使用而言,Apache Spark作业本质上是动态的。命名空间配额是固定的,并在准入阶段进行检查。如果pod请求不符合命名空间配额,则拒绝该请求。这需要Apache Spark作业为pod请求实现重试机制,而不是在Kubernetes本身内部对要执行的请求进行排队。

2) 命名空间资源配额是固定的,它不支持层次结构资源配额管理。

同样,很多时候,由于Kubernetes命名空间配额经常与基于组织层次结构的容量分配计划不匹配,用户可能会饿死地运行批处理工作负载。如今,缺少针对K8的作业的弹性、分层的优先级管理。

租户之间缺乏资源公平性

在生产环境中,经常发现Kubernetes默认调度程序无法有效地管理多样化的工作负载,无法为其工作负载提供资源公平性。一些关键原因是:

• 生产环境中的批处理工作负载管理通常会与大量用户一起运行。

• 在运行不同类型工作负载的密集生产环境中,Spark驱动程序pod很可能会占用命名空间中的所有资源。这样的场景对有效的资源共享提出了巨大挑战。

• 滥用或损坏的工作可能会轻易窃取资源并影响生产工作负载。

严格的SLA要求和计划延迟

专用于批处理工作负载的大多数繁忙的生产集群通常每天运行数千个任务和数十万个任务。这些工作负载需要大量并行容器部署,并且此类容器的寿命通常很短(从几秒钟到几小时)。这通常会产生数千个等待调度的Pod或容器部署的需求,使用Kubernetes默认调度程序会引入额外的延迟,这可能导致不满足SLA。

Apache YuniKorn如何提供帮助

Apache YuniKorn(正在孵化)概述

YuniKorn是用于服务和批处理工作负载的增强型Kubernetes调度程序。YuniKorn可以替换Kubernetes默认调度程序,或者根据部署用例使用K8s默认调度程序。

YuniKorn为包含无状态批处理工作负载和有状态服务的混合工作负载带来统一的跨平台调度体验。

YuniKorn vs Kubernetes默认调度程序:比较

特征

默认的调度器

YuniKorn

注释

应用概念

X

应用是YuniKorn的一等公民。YuniKorn会根据应用的提交顺序、优先级、资源使用情况等来调度应用。

作业排序

X

YuniKorn支持FIFO/FAIR/Priority(WIP)作业排序策略

细粒度的资源容量管理

X

使用层次结构队列管理集群资源。队列提供了保证的资源(最小)和资源配额限制(最大)。

资源公平

X

跨应用程序和队列的资源公平性,为所有正在运行的应用程序获得理想的分配

原生支持大数据工作负载

X

默认调度程序专注于长期运行的服务。YuniKorn专为大数据应用程序工作负载而设计,它本身支持在K8中高效运行Spark/Flink/Tensorflow等。

规模与绩效

X

YuniKorn针对性能进行了优化,适用于高吞吐量和大规模环境。

YuniKorn如何帮助运行Spark on K8s

YuniKorn具有丰富的功能集,可帮助在Kubernetes上高效地运行Apache Spark。可以在此处 找到详细步骤, 以通过YuniKorn运行Spark on K8s。

请阅读有关YuniKorn如何通过 YuniKorn Scheduler 在Cloud-Native Spark 调度中 授权在K8上运行Spark的更多详细信息。 发布在2020年Spark&AI峰会上。

让我们看一下一些用例,以及在这些情况下YuniKorn如何帮助实现Spark的更好资源调度。

多个用户(嘈杂)一起运行不同的Spark工作负载

随着越来越多的用户开始一起运行作业,变得很难隔离并为作业提供所需的资源,包括资源公平性、优先级等。YuniKorn调度程序提供了一种使用资源队列来管理资源配额的最佳解决方案。

在上面的YuniKorn中的队列结构示例中,使用放置策略将Kubernetes中定义的命名空间映射到Namespaces父队列下的队列。在测试开发队列有固定的资源限制。所有其他队列仅受集群大小限制。使用公平策略在队列之间分配资源,并且作业在生产队列中按调度的FIFO进行分配。

一些主要优势是:

• 一个YuniKorn队列可以在Kubernetes中自动映射到一个名称空间

• 队列容量本质上是弹性的,可以提供从配置的最小值到最大值的资源范围

• 尊重资源公平性可以避免可能的资源匮乏

YuniKorn提供了一种无缝的方式来管理Kubernetes集群的资源配额,它可以替代命名空间资源配额 。YuniKorn资源配额管理允许基于可插拔调度策略利用pod请求的排队和作业之间共享有限资源。无需任何其他要求即可实现所有这些要求,例如在Apache Spark上重试pod提交。

设置集群以基于组织层次结构的资源分配模型

在大型生产环境中,多个用户将一起运行各种类型的工作负载。通常,这些用户必须根据组织团队层次结构预算约束来消耗资源。这样的生产设置有助于在资源配额范围内有效地使用集群资源。

YuniKorn提供了一种在具有队列层次结构的集群中管理资源的功能。通过使用具有清晰层次结构(如组织层次结构)的资源队列,可以对多租户环境进行细粒度的资源容量管理。YuniKorn队列可以配置静态或动态管理,并且具有动态队列管理功能,用户可以设置放置规则 来委派队列管理。

多租户集群中更好的Spark作业SLA

在多租户集群中运行的普通ETL工作负载需要更轻松的方法来定义细粒度策略,以在所需的组织队列层次结构中运行作业。很多时候,此类策略有助于为作业执行定义更严格的SLA。

YuniKorn使管理员可以选择基于FIFO,FAIR等更简单的策略在队列中启用作业排序。 StateAware 应用程序排序策略 以FIFO顺序对队列中的作业进行排序,并根据条件逐一调度它们。这样可以避免在向单个名称空间(或集群)提交大量批处理作业(例如Spark)时出现常见的竞争情况。通过强制执行作业的特定顺序,它还改善了作业的调度,使其更加可预测。

为Apache Spark Job调度启用各种K8s功能集

YuniKorn与K8的主要发行版本完全兼容。用户可以在现有的K8s集群上透明地交换调度程序。YuniKorn完全支持在调度过程中可以使用的所有原生K8语义,例如标签选择器,Pod亲和力/反亲和力,污点/容忍度,PV/PVC等。YuniKorn还与管理命令和实用程序兼容,例如警戒线节点,通过kubectl检索事件等。

CDP中的Apache YuniKorn

Cloudera的CDP平台提供由Apache YuniKorn(孵化)提供支持的Cloudera 数据工程 经验。

Cloudera的YuniKorn解决了一些高级用例,

• 提供CDE虚拟集群的资源配额管理

• 提供Spark的高级作业调度功能

• 负责微服务和批处理作业调度

• 在启用自动缩放的情况下在云上运行

更好地支持Spark工作负载的未来路线图

YuniKorn社区正在积极研究一些核心功能增强功能,以支持Spark工作负载执行。一些高级功能是

对于Spark工作负载,必须分配最少数量的驱动程序和工作程序Pod,以提高执行效率。Gang调度有助于确保分配所需数量的Pod以启动Spark作业执行。此类功能在嘈杂的多租户集群部署中非常有用。有关更多详细信息,YUNIKORN-2 Jira正在跟踪功能进度。

作业/任务优先级支持

作业级别优先级排序有助于管理员用户确定优先级,并指导YuniKorn为基于SLA的高作业执行提供所需的资源。这也为有效利用集群资源提供了更大的灵活性。有关更多详细信息,YUNIKORN-1 Jira正在跟踪功能进度。

分布式跟踪

YUNIKORN-387 利用开放跟踪 来改善调度程序的整体可观察性。利用此功能,可以收集并保留核心调度周期中的关键跟踪记录,以进行故障排除,系统分析和监视。

总结

YuniKorn一方面有助于在大规模,多租户环境中有效地实现各种Spark工作负载的细粒度资源共享,另一方面可以动态地启动云原生环境。

YuniKorn因此使Apache Spark成为用户的企业级基本平台,为从大规模数据转换到分析到机器学习的各种应用程序提供了一个强大的平台。

作者:Sunil Govindan & WeiWei Yang & Wangda Tan & Wilfred Spiegelenburg

原文链接:https://blog.cloudera.com/apache-spark-on-kubernetes-how-apache-yunikorn-incubating-helps/

0 人点赞