1. 方案背景和挑战
Apache Spark,作为当今大数据处理领域的佼佼者,凭借其高效的分布式计算能力、内存计算优化以及强大的生态系统支持,已牢固确立其在业界的标杆地位。Spark on Kubernetes(简称K8s)作为Spark与Kubernetes这一领先容器编排平台深度融合的产物,不仅继承了Spark的强大数据处理能力,还充分利用了Kubernetes在资源管理、服务发现和弹性伸缩方面的优势,正逐步引领大数据处理迈向更加灵活、高效的新纪元。
与此同时,随着云计算技术的飞速发展,NVMe/TCP云盘作为一种创新的高性能存储解决方案,凭借其在低延迟、高吞吐量以及易于集成到现代云架构中的特点,日益受到大规模数据中心和云环境用户的青睐。这种存储方案通过TCP/IP协议实现远程NVMe设备的直接访问,极大地拓展了数据存取的边界,但也随之带来了特定的技术挑战。
具体而言,NVMe/TCP云盘在利用TCP/IP协议进行数据交互时,不可避免地涉及到了复杂的数据包处理流程,包括用户态与内核态之间的频繁数据拷贝、网络报文的接收、峰值流量的处理以及协议栈的深入解析等。这一系列操作大幅增加了CPU的负担,尤其是在高并发、大数据量场景下,大量CPU资源被非业务核心的数据包处理工作所占用,导致CPU资源利用率低下,甚至成为性能瓶颈。
当Apache Spark试图挂载并利用NVMe/TCP云盘进行大规模数据处理时,上述挑战便显得尤为突出:
1、Spark作业在执行过程中,若频繁遭遇CPU资源被TCP/IP协议栈处理所挤占的情况,不仅会直接限制Spark任务的处理速度,还可能导致任务执行延迟增加,进而影响整个数据处理流水线的吞吐率和效率。
2、由于CPU资源的争夺,Spark原本有望进一步提升的磁盘I/O性能也受到了限制,难以充分发挥NVMe/TCP云盘应有的高性能潜力。
为了解决Spark在挂载NVMe/TCP云盘时面临的CPU资源占用过高和磁盘吞吐性能受限的问题,亟需探索并实施一系列优化策略和技术方案。这可能包括但不限于:采用更高效的数据传输协议或技术(如RDMA),以减少CPU在数据拷贝和网络处理上的负担,提升数据传输性能;优化Spark作业的调度与执行策略,以更加合理地分配CPU资源;以及针对NVMe/TCP云盘特性进行专门的性能调优,如调整TCP窗口大小、优化网络队列配置等。
RDMA技术允许数据在远程主机的内存之间直接传输,无需经过CPU处理,从而极大地降低了数据传输的延迟并减少了CPU的负载。这一特性直接解决了Spark和Kubernetes集群中,尤其是在使用NVMe-oF云盘时,因网络传输效率低下而可能导致的性能瓶颈问题。
本方案通过DPU实现NVMe/RDMA的云盘挂载,从而提升Spark在云环境下处理大数据时的整体性能和效率。
2. 整体方案概述
本方案采用云原生架构,Spark采用Spark on Kubernetes部署模式,并且引入DPU为集群之上的容器提供存储服务的卸载和加速,融合了云原生架构与高性能存储的优势。方案整体架构如下图所示:
- 存储集群把NVMe存储设备以裸盘方式部署,计算节点通过硬件模拟向宿主机提供标准的nvme/virtio块设备,对存储协议的处理都卸载到DPU,提供硬件加速的NVMe over RDMA能力。
- K8S平台通过yusur-csi存储插件提供基于DPU的云盘挂载能力。
- 将Spark应用部署在K8S集群之上,Spark Pod挂载DPU硬件加速的NVMe/RDMA云盘,以更低的资源消耗获得更高的读写效率。
3. 测试方法和结果
3.1. 软件环境
软件包/工具/数据集列表
名称 |
版本 |
来源 |
备注 |
Spark |
3.4.2 |
社区开源项目 |
开源大数据处理框架 |
Java |
17.0.10 (Eclipse Adoptium) |