Spark+Volcano:更完善的调度能力的默认batch调度器

摘要:对于 Spark 用户而言,借助 Volcano 提供的批量调度、细粒度资源管理等功能,可以更轻松地从 Hadoop 迁移到 Kubernetes,同时大幅提升大规模数据分析服务的性能。

2022 年 6 月 16 日,Apache Spark 3. 3 版本正式发布,其中“Support Customized Kubernetes Schedulers”是 Spark 3. 3 版本的关键特性,其关键能力是支持框架级别的自定义 Kubernetes 调度程序,使用 Volcano 作为 Kubernetes 上 Spark 的默认批处理调度程序。这也是 Apache Spark 社区正式支持的 Volcano 的第一个版本。对于 Spark 用户而言,借助 Volcano 提供的批量调度、细粒度资源管理等功能,可以更轻松地从 Hadoop 迁移到 Kubernetes,同时大幅提升大规模数据分析服务的性能。

图片[1]-Spark+Volcano:更完善的调度能力的默认batch调度器-唐朝资源网

华为带头,与主流厂商合作

该功能由华为发起,由来自华为、苹果、Cloudera、Netflix、Databricks等公司的开发者完成。通过在 Apache Spark 中支持自定义调度能力,用户可以接入各种第三方自定义调度。

Spark + Volcano:更好的调度能力

Spark 的资源管理平台正在向 Kubernetes 演进。在现有的Apache Spark架构下,Job的单主多从节点分离调度导致了Spark驱动节点的资源死锁问题。会出现这样的问题。同时,由于原生 Kubernetes 的调度能力有限,无法在作业粒度上完成队列调度、公平调度、资源预留等功能。

Volcano作为CNCF社区第一个云原生批量计算,于2019年6月在上海KubeCon正式开源,并于2020年4月成为CNCF官方项目。2022年4月,Volcano正式晋升为CNCF孵化项目。Volcano社区自开源以来,迅速应用于人工智能、大数据、基因测序、转码、渲染等海量数据计算分析场景,构建了完整的上下游生态系统。目前,腾讯、爱奇艺、小红书、蘑菇街、唯品会、鹏程实验室、瑞天投资等公司已经在生产环境中使用了Volcano。

Spark 官方对 Volcano 的支持将进一步加快大数据平台向 Kubernetes 迁移的进程,帮助 Spark 用户应对以下常见的批量调度场景。

常见调度场景:Job-based Fair-share

在运行多个弹性作业(例如流式分析)时,需要为每个作业公平分配资源,以满足多个作业竞争额外资源时的 SLA/QoS 要求。在最坏的情况下,单个作业可能会启动大量资源利用率低的 Pod,导致其他作业因资源不足而无法运行。为了避免分配太小(例如每个作业启动一个 Pod),Volcano 允许弹性作业定义应该启动的最小可用 Pod 数量。任何超过指定最低可用性的 pod 都将与其他作业公平地共享集群资源。

队列

队列还广泛用于为弹性和批处理工作负载共享资源。队列的主要目的是:

队列被实现为集群范围的 CRD,与命名空间实现分离。这允许将在不同命名空间中创建的作业放置在共享队列中。队列还提供最小值和最大值。Min 是队列的最小保证资源。任何时候在队列中提出紧急任务时,保证min资源可用,max是队列资源使用的上限。如果 min 和 max 之间的资源空闲,则允许与其他队列共享任务,以提高整体资源利用率。

面向用户,跨队列公平调度(Namespace-based fair-share Cross Queue)

图片[2]-Spark+Volcano:更完善的调度能力的默认batch调度器-唐朝资源网

在队列中,每个作业在调度周期内被调度的机会几乎相等,这意味着拥有更多作业的用户有更大的机会调度他们的作业,这对其他用户是不公平的。例如,有一个资源很少的队列,10 个 Pod 属于 UserA,1000 个 Pod 属于 UserB。在这种情况下,UserA 的 pod 绑定到节点的概率很小。

为了平衡同一队列中用户之间的资源使用情况,需要更细粒度的策略。考虑到 Kubernetes 中的多用户模型,命名空间用于区分不同的用户,每个命名空间都会配置一个权重,作为控制其资源使用优先级的手段。

抢占和回收

为了支持公平共享的借贷模型,一些作业/队列在空闲时会过度使用资源。但是,如果有任何进一步的资源请求,资源“所有者”将“收回”。队列或作业之间可以共享资源:回收用于队列之间的资源平衡,抢占用于作业之间的资源平衡。

最小资源预留

图片[3]-Spark+Volcano:更完善的调度能力的默认batch调度器-唐朝资源网

在运行具有多个任务角色的作业(例如 Spark)时,Spark driver pod 将首先创建并运行,然后请求 Kube-apiserver 创建 Spark executor pod。在资源有限或高并发的场景下,经常会出现大量的作业提交。所有可用资源都被 Spark driver pod 耗尽,Spark executor 无法获取资源,最终所有 Spark 作业都无法正常运行。为了解决这个问题,用户为 Spark driver pod 和 executor pod 创建了专门的节点进行静态划分,带来了资源碎片化和利用率低的问题。Volcano 提供的最小资源预留允许为每个 Spark 作业预留资源,防止 Spark 执行器无法获取资源导致的死锁问题。

预订和回填

当请求大量资源的“巨大”作业提交给 Kubernetes 时,当管道中有许多小作业时,根据当前的调度策略/算法,该作业可能会饿死并最终被杀死。为避免饥饿,应有条件地为作业保留资源,例如超时。当资源被保留时,它们可能是空闲的和未使用的。为了提高资源利用率,调度程序将有条件地将“较小的”作业回填到那些保留的资源中。保留和回填都是根据插件的反馈触发的:Volcano 提供了几个回调接口供开发人员或用户决定应该填充或保留哪些作业。

未来发展

随着场景的日益丰富,Volcano也在不断的加入新的算法,同时对应的界面也在不断的完善,方便用户扩展和定制对应的算法。另一方面,社区也在不断拓展技术版图,支持跨云跨集群调度、主机托管、FinOps、智能弹性调度、细粒度资源管理等新场景。

图片[4]-Spark+Volcano:更完善的调度能力的默认batch调度器-唐朝资源网

近期,我们还将对 Volcano 在 Spark3.3 中带来的批量调度能力进行详细的技术解读,敬请期待。添加火山助手k8s2222,进入火山社区交流群,定期分享。

Spark 3.3 发行说明:

火山官网:

GitHub:

点击关注,第一时间了解华为云新技术~

© 版权声明
THE END
喜欢就支持一下吧
点赞265赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容