Spark on Kubernetes 与 Spark on Yarn 不完全对比分析

2023-11-16

前言

Apache Spark 是目前应用最广泛的大数据分析计算工具之一。它擅长于批处理和实时流处理,并支持机器学习、人工智能、自然语言处理和数据分析应用。随着 Spark 越来越受欢迎,使用量越来越大,狭义上的 Hadoop (MR) 技术栈正在收缩。另外,普遍的观点和实践经验证明,除了大数据相关的工作负载,Hadoop (YARN) 不具备相应的灵活性去跟更广泛的企业技术栈融合与集成。比如去承载一些在线业务,而这正是 Kubernetes(K8s) 所擅长的领域。事实上,Kubernetes 的出现为 Spark 的改进打开了一个新世界的大门,创造了更多机遇。如果能用统一的一套集群去运行所有在线和离线的作业,也是十分吸引人的事情。

Spark on Kubernetes 于 Spark 2.3 [1] 版本引入开始,到 Spark 3.1 [2] 社区标记 GA,基本上已经具备了在生产环境大规模使用的条件。

在业内,苹果[3], 微软[4], 谷歌,网易,华为、滴滴,京东等公司都已经有内部大规模落地或者对外服务的经典成功案例。

Spark on Kubernetes 应用架构

从 Spark 整体计算框架层面来看,只是在资源管理层面多支持了一种调度器,其他接口都可以完全复用。一方面 Kubernetes 的引入和 Spark Standalone、YARN、 Mesos 及 Local 等组件形成了一个更为丰富的资源管理体系。

另一方面,Spark 社区在支持 Kubernetes 特性的同时,对用户 API 的兼容度也得到了最大化的保留,极大程度上方便了用户任务的迁移。比如对于一个传统的 Spark 作业而言,我们通过简单的指定 --master 参数为 yarn 或者 k8s://xxx,即可完成两个调度平台的运行时切换。其他参数诸如镜像、队列、Shuffle 本地盘等配置, yarn 和 k8s 之间都是隔离的,可以很方便地统一在配置文件中统一维护。

Spark on Kubernetes vs Spark on YARN

易用性分析

Spark Native API

以 spark-submit 这种传统提交作业的方式来说,如前文中提到的通过配置隔离的方式,用户可以很方便地提交到 k8s 或者 YARN 集群上运行,基本上一样的简单和易用。这种方式对于熟悉 Spark API 及生态的用户而言是十分友好的,基本上没有对 k8s 技术栈的硬性要求。

可以看到,如果我们忽略 K8s 或者 YARN 的底层细节,基本上还是熟悉的配方熟悉的味道。

Spark Operator

另外,除了这种方式, Kubernetes 在 API 上更加丰富。我们可以通过 Spark Operator[6] 的的方式, 如 kubectl apply -f <YAML file path>来创建和管理 Spark on k8s 应用。这种方式对于 Kubernetes 集群本身及用户而言无疑是最优雅的,而对没有 Kubernetes 经验的这部分 Spark 用户而言,有一定的学习成本。这种方式另一个好处是,Spark 的相关 lib 都可以通过 Docker 仓库来 Deploy,不需要单独的 Spark Client 环境来提交作业。单独的 Client 环境,容易造成版本和 Docker 不一致,增加运维成本,也会埋下引发一些不必要的线上问题的隐患。

Serverless SQL

当然,无论是 Spark 原生的还是 Operator 的方式,对大部分用户来说还是太原始了,不可避免的需要去感知一些底层的细节。在 Datalake/Lakehouse 场景下,数据变得民主,数据应用变得多样,很难去大范围地推广。在易用性上想更进一步,可以考虑使用 Apache Kyuubi (Incubating) [7] 来构建 Serverless Spark/SQL 服务。大部分情况下,用户都可以直接使用 BI 工具或者 SQL 来直接操作数据即可。

一般而言,大部分企业都会有很多离线的 Hive 或者 Spark 任务跑在 YARN 集群上,如何将大量的历史任务平滑地迁移到 Kubernetes 上也是让人头疼的问题。Kyuubi 的服务化方案,可以通过服务发现机制,提供负载均衡节点,在服务高可用的基础上,来平滑地过渡。对于个别异常迁移任务,我们也可以方便地 Rollback 到 老集群上保障执行,也留给我们定位问题的时间和空间。

性能对比

从原理上,无论是 Kubernetes 和 YARN 都只起资源调度的作用,不涉及计算模型和任务调度的变化,所以在性能上的差异应该是不显著的。从部署架构上,Spark on Kubernetes 一般选择存算分离的架构,而 YARN 集群一般和 HDFS 耦合在一起,前者会在读写 HDFS 时丧失“数据本地性”,这个由于网络带宽因素影响可能会影响性能。从存算耦合架构诞生之初经过10年左右的发展,随着网络的性能增长,各种高效的列式存储格式及压缩算法的加持,这点影响微乎其微。

Terasort 基准测试 (By Myself)

TPC-DS 基准测试(By Data mechanics)

TPC-DS 基准测试(By  AWS)

虽然这些测试结果都不是来自 TPC-DS 组织认证的官方数据,但从测试结果来自不同的机构这个因素上也有足够的说服力。我们屏蔽一些部署架构上的影响,两者的性能差距可以说是基本不存在的。

成本对比

将 Spark 作业迁移至 Kubernetes 集群上,可以实现离线和在线业务的混合部署,利用两种业务特征的对计算资源潮汐错峰效应,极致的情况下光靠“离/在混部”就可实现 IT 总有用成本(TCO)的 50%的节省。

另一方面,企业数据平台在不同的发展时期,集群所规划的存储算力比不同,导致服务器选型困难,而从存算分离的的角度,计算集群和存储集群分开扩容,也可以更加合理地控制 IT 成本。

此外,Spark on Kubernetes 通过 Pod 分配 Executor 模式,执行线程数(spark.executor.cores)和 Pod 的 request cpu 是分离的,可以更加细粒度的在作业级别对控制,来提升计算资源的使用效率。在我们网易的实际实践中,在不影响整体计算性能的条件下,Spark on Kubernetes 作业整体上 cpu 可以达到超 200%的超售比。

当然,Spark on Kubernetes 在动态资源分配(Dynamic Resource Allocation)这个特性上的缺失或者不完善,可能会造成 Spark 占着资源不使用的情况。由于这个特性直接依赖外置的 Shuffle Service 服务来实现,这时候可能就需要自行去搭建 Remote/External Shuffle Service 服务。

在 Spark on Kubernetes 场景下,基于 RSS/ESS 可实现临时存储与计算过程相互解耦。第一,消除本地存储依赖,使得计算节点可在异构节点上动态伸缩,在面对复杂物理或者虚拟环境时更加灵活的动态扩展。第二,离散式本地存储优化为集中式服务化存储,存储容量所有计算节点共享,提高存储资源利用率。第三,降低磁盘故障率,动态地减少标记为不可用计算节点,提升计算集群整体资源利用率。最后,转移临时存储的血缘关系,使其不再由 Executor Pod 计算节点维护,使得闲置 Executor Pod 可以被及时地释放回资源池,提升集群资源利用率。

其他对比

Spark on k8s

Spark on yarn

何时支持

Spark 2.3.0

Spark 0.6.0

大规模生产

较少

主流

调度器架构

共享状态调度架构

集中式调度器

社区活跃度

活跃

不活跃

最小调度单位

Pod

Container

日志聚合

Spark Web UI

port-forward

proxy

多租户

Namespace

queue

数据本地性

HDFS 读写 - 差

Shuffle 读写 – 好

HDFS 读写 – 理论上好,生产上一般

Shuffle 读写 - 好

HDFS集成流畅度

Spark 3.0及以上

完备

总结

Spark on Kubernetes 自 2018年初随 2.3.0 版本发布以来,不知不觉已经有四个年头了,而到现在的 3.2 版本,也已经历经 5 个大版本了。在社区和用户的不断打磨下已经成为了非常成熟的特性了。

随着 Apache Spark 开源生态不断发展,如 Apache Kyuubi 等,无论是哪个调度框架,易用性上都得到大幅提升。

IT 基础设施的总拥有成本(Total Cost of Ownership, TCO) 逐年上涨,一直是困扰很多企业的难题。Spark + Kubernetes 的组合的灵活性和超高性价比,给了我们更多想象的空间。

参考资料

  1. https://issues.apache.org/jira/browse/SPARK-18278

  2. https://issues.apache.org/jira/browse/SPARK-33005

  3. https://www.youtube.com/watch?v=xX2z8ndp_zg

  4. https://www.youtube.com/watch?v=hcGdW_6xTKo

  5. https://ieeexplore.ieee.org/document/9384578

  6. https://github.com/GoogleCloudPlatform/spark-on-k8s-operator

  7. https://github.com/apache/incubator-kyuubi

  8. https://aws.amazon.com/cn/blogs/containers/optimizing-spark-performance-on-kubernetes/

作者:Kent Yao,网易数帆技术专家,Apache Kyuubi(Incubating) PPMC,Apache Spark Committer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark on Kubernetes 与 Spark on Yarn 不完全对比分析 的相关文章

  • 安全狗linux 安装教程,linux网站安全狗(apache版)安装教程

    以32位安装包为例子 64位安装包只要将对应的32改成64即可 步骤一 到http safedog cn下载软件安装包 tar gz格式 safedogwz linux32 tar gz 也可以采取wget的方式下载安装包 wget htt
  • 如何制作和训练自己的数据集(YoloV5)

    标注方法 1 自己获取的数据集 人工进行标注 全人工 2 自己获取的数据集 首先使用训练好的网络标注一遍 然后手动进行微调 半人工 3 仿真数据集 GAN网络来生成自己的数据集 synthetic data 标注工具 1 CVAT 需要安装
  • undefined 和 undeclared 的区别

    var a undefined b b is not defined 区别 在变量作用域中已经申明但没有赋值的变量 如 a 是undefined 相反 在变量作用域中没有申明过的变量 是undeclared 我们试图访问 undeclare

随机推荐

  • ahook中常用的一些hooks

    官方文档 https ahooks js org zh CN 以下总结一些个人认为非常实用的hook 1 useRequest 请求 import useRequest from ahooks const getSome async gt
  • VUE中使用防抖和节流

    目的 减少请求次数 节省资源 防抖 在事件触发n秒后执行函数 如果在n秒内再次出发 就重新计算 节流 在多次执行某一动作时 限制为每隔一段时间执行一次函数 防抖 连续的事件 只需触发一次 eg 高频率的点击 防止表单重复提交 输入框搜索 输
  • jdk8以上jvm常用参数

    这几天一直在折腾jvm调优的事情 作为新手 把自己遇到的问题记录下来 调整jvm参数的方法有很多 网上也到处是 我也看了很多 选择用tomcat进行jvm参数设置 linux服务器配置 linux系统下的tomcat通过startup sh
  • MySQL优化之索引原理(二)

    一 前言 上一篇内容说到了MySQL存储引擎的相关内容 及数据类型的选择优化 下面再来说说索引的内容 包括对B Tree和B Tree两者的区别 1 1 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构 对性能的提升有很大的帮助 尤
  • 让我来教你如何免费使用RHEL小红帽系统

    RHEL安装注册过程中遇到的问题 从开始注册到正常使用 如何获取正版RHEL 注意事项 VMware虚拟机下载安装 安装中出现的问题 从开始注册到正常使用 答主是个动手能力比较强的人 所以当老师讲到Linux的时候 我就已经掌握了Linux
  • 计算机表格怎么取消分页,Excel表格自动分页、取消分页等技巧 专家详解

    Excel是一款功能强大的软件 利用Excel制作表格时 有时我们需要对表格进行分页打印 那么Excel表格如何自动分页 取消分页呢 下面小编为你带来解答 工具 材料 Excel2010 操作方法 01 打开Excel2010 进入要编辑的
  • 程序包com.sun.xml.internal.messaging.saaj.packaging.mime.util不存在

    添加maven compiler plugin插件即可
  • 区块链技术的应用与发展

    区块链的概念 区块链技术起源于2008年由化名 中本聪 的学者在密码学邮件组发表的奠基性论文 比特币 一种点对点电子现金系统 目前尚没有行业内公认的区块链定义 狭义来讲 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数
  • 怎么解决Ubuntu下Hadoop的报错:hadoop:command not found?

    在执行hadoop下的子项目 文字计数功能时出现hadoop command not found 的报错 通过百度以及问老师同学才知道报错的原因是Hadoop的环境变量配置出了问题 解决方案如下 输入命令 sudo vi etc profi
  • 滑动窗口+前缀和-8--LC930.和相同的二元子数组

    class Solution object def numSubarraysWithSum self nums goal type nums List int type goal int rtype int 1 前缀和 presum 0 a
  • RxDownload-基于RxJava打造的下载工具, 支持多线程和断点续传

    http www jcodecraeer com a anzhuokaifa androidkaifa 2016 1104 6743 html 大文件下载测试中 内存占用一直趋于平稳 主要功能 使用Retrofit OKHTTP来进行网络请
  • qt中事件分发器event和事件过滤器eventFilter使用

    在qt中窗口部件接收到主程序的消息映射后 会进入到事件分发器模块 就是event虚函数接口 我们可以在该接口里进行特定事件的自定义处理 而当窗口部件需要过滤某一事件时 可以使用事件过滤器模块 就是eventFilter虚函数接口 它是在进入
  • 阿里云服务上Elasticsearch的安装及简单使用(一)

    Elasticsearch是一个高度可伸缩的开源全文搜索和分析引擎 它允许你以近实时的方式快速存储 搜索和分析大量的数据 它通常被用作基础的技术来赋予应用程序复杂的搜索特性和需求 关于Elasticsearch的一些几本概念 在此不做过多的
  • arduino+ESP32 web配网演示代码

    include
  • 如何查看自己的公网ip

    windos查看公网ip地址 1 直接访问 百度 2 就是win r输入cmd然后输入 tracert www baidu com 3 其他查询地址 https ip cn https ip138 com https ifconfig me
  • 生成对抗网络GANs理解(附代码)

    生成对抗网络GANs理解 附代码 原文地址 http blog csdn net sxf1061926959 article details 54630462 生成模型和判别模型 理解对抗网络 首先要了解生成模型和判别模型 判别模型比较好理
  • jax安装Ubuntu,cudnn版本查看

    Ubuntu18 04 有GPU jax安装后显示错误如图所示 无法识别GPU 使用升级后并不能解决 Cuda gt 11 8 and cudnn gt 8 6 采用如下方法重新安装 pip install jax cuda11 cudnn
  • 【详解】静态Web服务器搭建代码实现_Python

    目录 1 浏览器网络请求流程 2 搭建python自带静态web服务器 2 1 静态web服务器开发流程 2 2 返回指定页面 2 3 多任务版服务器 2 4 面向对象服务端 3 动态端口 1 浏览器网络请求流程 浏览器首先链接DNS服务器
  • “只出现一次的数字”系列 剑指offer--位运算学习(一)

    最近学了下位运算 简单说说收获吧 首先我们要了解下常见的位运算操作 与或非操作 异或操作 进阶规律 与或非 和 异或都是满足结合律的 重点 a b c ab b c a a 0 a a 1 0 b b 我们先来看看第一道题 做这道题需要一个
  • Spark on Kubernetes 与 Spark on Yarn 不完全对比分析

    前言 Apache Spark 是目前应用最广泛的大数据分析计算工具之一 它擅长于批处理和实时流处理 并支持机器学习 人工智能 自然语言处理和数据分析应用 随着 Spark 越来越受欢迎 使用量越来越大 狭义上的 Hadoop MR 技术栈