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

2022年6月16日,Apache Spark 3.3版本正式发布,其中《Support Customized Kubernetes Schedulers》作为Spark 3.3版本的重点(Highlight)特性,其关键能力是从框架层面支持定制化的Kubernetes度器,并且将Volcano作为Spark on Kubernetes的默认batch调度器。这也是Apache Spark社区官方支持Volcano的第一个版本。对于Spark用户而言,借助Volcano提供的批量调度、细粒度资源管理等功能,可以更便捷的从Hadoop迁移到Kubernetes,同时大幅提升大规模数据分析业务的性能。

华为牵头发起,主流厂商协作

该特性由华为牵头发起,由来自华为、Apple、Cloudera、Netflix、Databricks等公司的开发者共同协作完成。通过在Apache Spark支持自定义调度能力,允许用户插件化使用各种第三方自定义调度。

Spark + Volcano:更完善的调度能力

Spark的资源管理平台正在向Kubernetes演进,Apache Spark现有架构下,Job的单主、多从节点的分离调度,导致了Spark driver节点资源死锁问题,尤其是在资源紧张的情况下,会经常出现此类问题。同时,由于原生Kubernetes的调度能力受限,也无法完成Job粒度诸如队列调度、公平调度、资源预留等功能。

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都将公平地与其他作业共享集群资源。

队列 (Queue)

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

  • 在不同的“租户”或资源池之间共享资源,例如将每一个部门映射到一个队列,实现多个部门通过队列的权重,动态共享集群的资源。
  • 为不同的“租户”或资源池支持不同的调度策略或算法,如FIFO、Fairness、Priority等

队列被实现为集群范围的CRD,和namespace实现了解耦。这允许将在不同namespace中创建的作业放置在一个共享队列中。队列还提供了min和max,min是队列的最小保障资源,任何时刻该队列有紧急任务提上来都保证有min资源可用,max是队列资源使用上限。min和max之间的资源如果闲置,允许共享给其他队列的任务来提升整体的资源利用率。

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

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

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

抢占 (Preemption & Reclaim)

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

最小资源预留(minimal resource reservation)

运行拥有多个任务角色的作业时(如Spark)时,Spark driver pod会先创建并运行,然后请求Kube-apiserver创建Spark executor pod,在资源紧张或高并发的场景,时常会出现大量作业提交导致所有可用资源被Spark driver pod耗尽,Spark executor无法获取资源,最终所有Spark作业无法正常运行。为解决此问题,用户为Spark driver pod 和 executor pod创建专有节点进行静态划分,而这带来了资源碎片、利用率低下的问题。Volcano提供的minimal resource reservation 允许为每个Spark作业预留资源,防止Spark executor无法获取资源而导致的死锁问题,相比于静态划分的作法,性能提升30%+。

预留与回填 (Reservation & Backfill)

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

未来发展

随着场景的日益丰富,Volcano也在不断的添加新的算法,同时,相应的接口也在不断的完善,方便用户扩展并自定义相应的算法。另一方面,社区也在持续的扩大技术版图支持新的场景如跨云跨集群调度、混部、FinOps、智能弹性调度、细粒度资源管理等。

近期我们还会对Spark 3.3中Volcano 带来的批量调度能力进行详细技术解读,敬请期待。添加Volcano小助手k8s2222,进入Volcano社区交流群,大咖在侧,定期分享。

Spark 3.3 release notes: https://spark.apache.org/releases/spark-release-3-3-0.html

Volcano官网:https://volcano.sh/zh/docs/

Github : https://github.com/volcano-sh/volcano

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

Volcano成Spark默认batch调度器的更多相关文章

  1. spark的task调度器(FAIR公平调度算法)

    FAIR  调度策略的树结构如下图所示: FAIR 调度策略内存结构 FAIR 模式中有一个 rootPool 和多个子 Pool, 各个子 Pool 中存储着所有待分配的 TaskSetMagage ...

  2. 转: 调整 Linux I/O 调度器优化系统性能

    转自:https://www.ibm.com/developerworks/cn/linux/l-lo-io-scheduler-optimize-performance/index.html 调整 ...

  3. MapReduce调度器

    1. 先进先出(FIFO)调度器 先进先出调度器是Hadoop的默认调度器.就像这个名字所隐含的那样,这种调度器就是用简单按照“先到先得”的算法来调度任务的.例如,作业A和作业B被先后提交.那么在执行 ...

  4. Kubernetes 学习20调度器,预选策略及优选函数

    一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...

  5. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

  6. Hadoop的调度器总结

    Hadoop的调度器总结 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇.在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作 ...

  7. JStorm与Storm源码分析(三)--Scheduler,调度器

    Scheduler作为Storm的调度器,负责为Topology分配可用资源. Storm提供了IScheduler接口,用户可以通过实现该接口来自定义Scheduler. 其定义如下: public ...

  8. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  9. RxJS——调度器(Scheduler)

    调度器 什么是调度器?调度器是当开始订阅时,控制通知推送的.它由三个部分组成. 调度是数据结构.它知道怎样在优先级或其他标准去存储和排队运行的任务 调度器是一个执行上下文.它表示任务在何时何地执行(例 ...

随机推荐

  1. 地铁系统ajax人性化操作

    根据选择的城市不同,显示的地铁系统和线路图也不同

  2. 安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了

    本章目录 1.引言 1.1 目的 1.2 目标范围 1.3 读者对象 2.参考说明 2.1 帮助参考 2.2 参数说明 3.3 模块说明 3.服务优化 3.1 系统内核 3.2 编译优化 3.3 性能 ...

  3. 认识 vh 和 vw 单位

    1. 页面 html 结构 <header> <h1>欢迎来到米修在线</h1> <p>Lorem ipsum dolor sit amet conse ...

  4. 为何PostgreSQL即将超越SQL Server?

    DB-Engines 2021年10月份统计,PostgreSQL当月上升10.30点,总分是597.27:SQLServer当月大幅下降16.32,总分是954.29 .按照这样的速度,2年之内,P ...

  5. XCTF练习题---MISC---Training-Stegano-1

    XCTF练习题---MISC---Training-Stegano-1 flag:steganoI 解题步骤: 1.观察题目,下载附件 2.打开下载的图片文件,发现就是一个点,修改文件扩展名,还是说查 ...

  6. WPF样式和触发器

    理解样式 样式可以定义通用的格式化特征集合. Style 类的属性 Setters.Triggers.Resources.BasedOn.TargetType <Style x:Key=&quo ...

  7. 【导包】使用Sklearn构建Logistic回归分类器

    官方英文文档地址:http://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LogisticRegression.html# ...

  8. WIN10 使用注册表设置单应用KIOSK模式(不限win10版本)

    注意事项 下载安装Autologon.exe. 以下示例采用账号:- 账户:'KIOSK'- 密码:'KIOSK' 设置步骤 新建用户 1.进入windows设置->账户->其他用户,点击 ...

  9. VMware配置与管理DNS服务器

    一,安装DNS服务器角色 1,点击[开始]→[管理工具]→[服务器管理器]→"仪表板"选项的[添加角色和功能] 持续单击[下一步],直到出现"选择服务器角色"窗 ...

  10. JVM探究

    1.JVM探究 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取 ...