其他
字节跳动 Spark Shuffle 大规模云原生化演进实践
主要内容包括以下几大部分:
1. 背景介绍
2. 稳定性资源场景
3. 混部资源场景
分享嘉宾|程航 字节跳动 计算引擎开发工程师
编辑整理|钟理
内容校对|李瑶
出品社区|DataFun
1. 原理
2. 挑战
首先,从 NM 迁移到 DaemonSet 的过程中,DaemonSet 上 ESS 的 CPU 有非常严格的限制,而在之前的 NM 模式下,ESS 基本上可以使用所有的 CPU 资源。所以在这个迁移实践中,往往最开始设置的 ESS 的 CPU 资源是不够的,需要经过持续不断的调整。后续,某些高优集群甚至直接放开对 ESS 的 CPU 使用。 同时,DaemonSet 和 Pod 对 Spark 作业的 CPU 有更严格的限制。这也导致不少用户的作业迁移到了新的架构后变得更加缓慢了。这是因为在之前的模式下,CPU 是有一定的超发的,因此需要对这个情况进行调整。我们在 Kubernetes 和 Godel 架构下开启了 CPU Shares 模式,使用户在迁移过程中感知不到性能上的差异。 另外,Pod 对内存的限制也非常严格,这导致 Shuffle Read 时无法使用空闲的 page cache 资源,从而导致 Shuffle Read 时 page cache 的命中率非常低。这个过程会带来更多的磁盘 IO 开销,导致整体性能变差。对此我们采取了相应的措施,通过适当开放 Pod 对 page cache 的使用,降低 Shuffle 在迁移后对性能的影响。
3. 收益
稳定资源集群环境。这些稳定资源的集群主要以服务高优和 SLA 的任务为主。部署的磁盘是性能比较好的 SSD 磁盘。对于这些稳定资源集群,主要使用基于社区、深度定制化后的 ESS 服务。使用 SSD 磁盘,ESS 读写,也可以使用到本地的高性能 SSD 磁盘。部署在 Daemonset 模式,Godel 架构下。 混部资源集群环境。这些集群主要服务于中低游的作业,以一些临时查询、调试或者测试任务为主。这些集群的资源主要都部署在 HDD 磁盘上,有些是通过线上资源出让或与其他服务共用的或者其他线上的服务共同部署的一些资源。这就导致集群的资源都不是独占的,整体的磁盘性能以及储存环境也都不是特别优异。
稳定资源场景
1. ESS 深度定制
收益
在作业运行正常的时候,即使开启了限流功能,也不会对作业有任何影响。节点如果可以正常服务,是不需要触发任何限流的。 只有当节点的负载超过可以承受的范围,且 Shuffle IO 超过设置的阈值后,才会启动限流机制,减少异常任务可以向 ESS 发送的请求数量,减低这个 ESS 服务当前的压力。由于这时候 ESS 服务的负载能力已经超过了可承受的范围,即使它收到这些请求,也无法正常返回这些请求,因此,限制异常任务过多的请求反而可能更好地提高这些任务本身的性能。 在限流的情况下,也会考虑作业的优先级。对于高优的任务,会允许更大的流量。 当限流生效后,如果发现 ESS 的流量已经恢复正常了将迅速解除限流。受限流的 Application 很快就可以恢复到之前的流量水平。
2. 云原生优化
效果
混部资源场景
1. CSS 功能介绍
2. CSS 整体架构
Cluster Manager 负责集群的资源分配,并维护集群 Worker 和 Application 状态,它可以通过 Zookeeper 或者本地磁盘保存这些信息,达到具有 High Availability 的服务。 Worker 支持两种写入模式,分别是磁盘模式和 HDFS 模式。目前常用的是磁盘模式,每个分区的数据会写入两个不同的 Worker 节点,以实现数据冗余。 CSS Master 位于 Spark driver 端,主要负责与 Cluster Manager 的心跳联系以及 Application Lifecycle。作业启动时,也会向 Cluster Manager 申请 Worker。Shuffle Stage 的过程也会统计 Shuffle Stage 的元数据以及的进展。 Shuffle Client 是一个接入了 Spark Shuffle API 的组件,允许任何 Spark 作业直接使用 CSS 而无需额外配置。每个 Executor 会使用 ShuffleClient 进行读写。Shuffle Client 在写入时进行双写,在读的时候,它可以向任何一个存有数据的 Worker 读取这些数据,如果其中一个 Worker 读取失败的话,也会自动切换到另一个 Worker 上,并对多读的数据进行去重。
3. CSS 性能与未来演进
分享嘉宾
INTRODUCTION
程航
字节跳动
计算引擎开发工程师
往期推荐
点个在看你最好看