架构介绍

OmniShuffle Shuffle加速组件特性是一个大数据引擎Spark的性能加速组件,运行在客户数据中心的大数据集群内,通过内存池统一编址、数据内存语义交换及融合Shuffle等关键特性,减少数据磁盘I/O开销,提高数据分析的时效性和集群资源利用率。OmniShuffle Shuffle加速组件支持RSS/ESS两种模式,仅在部署形式和配置上存在少许差异,可自由便捷地切换两种模式。

OmniShuffle Shuffle加速组件作为Spark的性能加速组件,通过Spark提供的插件机制,实现Shuffle Manager和Broadcast Manager插件接口,无侵入式替换Spark的原生Shuffle和Broadcast。

ESS模式

大数据Spark中Shuffle密集型的作业,在Map过程完成后,需要进行大量数据的跨节点交换。统计数据显示,Spark Shuffle过程在很多场景中占据了最多的时间和资源开销,甚至可以占到Spark业务端到端时间开销的50%到80%。Spark提供Shuffle Manager插件的能力,可以对Shuffle过程进行优化。开发者和用户可以通过Shuffle Manager定义的接口构建定制的Shuffle Manager,控制Shuffle的策略、方法和过程。

ESS模式通过实现Shuffle Manager插件接口使能In-memory Shuffle,即在内存池中通过内存语义完成Shuffle过程,减少Shuffle数据落盘,降低数据落盘读取、序列化和反序列化、压缩和解压缩带来的时间开销和算力开销。通过实现Broadcast Manager接口使能基于内存池共享的方式进行变量广播,提升广播变量在各个Executor之间的共享传输效率。同时,OmniShuffle Shuffle加速组件支持RDMA(Remote Direct Memory Access)和TCP两种网络模式。相比TCP,RDMA可提高传输效率,降低对算力的要求,实现节点间数据的高效交换。ESS模式更适合小集群,要求高性能场景。

RSS模式

数据分析业务场景中,数据量呈井喷式增长,且数据呈现出多源和异构的特征,导致数据分析成本越来越高。同时,传统的Shuffle架构对本地存储有很强的依赖,无法做到存算分离,reduce节点存在很多碎片化的磁盘读写,严重影响效率。此外,传统Shuffle在可靠性上也存在缺陷,在大规模场景下,磁盘故障时的Shuffle数据丢失导致stage重算,链接数量过多会导致网络数据拉取失败。

RSS模式创新地采用了存算分离架构设计,确保计算节点和存储节点各尽所能,分工协作。通过对SparkShuffle写流程的重写,BoostRSS会将MAP阶段所产生的数据统一保存至RSS节点内,从而把原有的小文件和小I/O操作,聚合成高效的大文件与连续大I/O操作。能够显著增强磁盘读写的效率,减轻计算节点I/O处理压力,进一步释放其计算能力,大大提升整体MapReduce任务的执行性能。RSS模式更适合中大集群,要求高可靠性场景。

叠加OmniOperator 算子加速

大数据引擎多采用Java/Scala算子,无法充分发挥CPU的能力。同时,对于异构算力,也不适用或无法发挥硬件的计算性能优势。OmniOperator算子加速特性使用Native Code充分发挥硬件计算性能优势,尤其是异构算力的计算能力。

通过OmniOperator 算子加速特性提升算子执行效率,同时使用OmniShuffle Shuffle加速组件特性优化数据交互过程,实现端到端提升引擎查询性能。

整体方案

OmniShuffle Shuffle加速组件通过实现Spark的Shuffle Manager插件接口使能In-memory Shuffle,OmniShuffle Shuffle加速组件整体方案架构如图1所示,子系统的介绍如表1所示。

图1 OmniShuffle Shuffle加速组件逻辑架构图
表1 子系统介绍

子系统

子系统介绍

内存池套件

提供分布式共享内存基础设施,并提供基础的内存语义。

元数据

保存Shuffle数据、节点相关信息的基础信息。

Shuffle语义

提供Spark Shuffle语义实现的相关接口。

Broadcast语义

提供Spark Broadcast语义实现的相关接口。

业务流程

OmniShuffle Shuffle加速基于Spark提供的ShuffleManager接口,结合内存池套件,实现Spark的Shuffle加速,OmniShuffle Shuffle加速组件业务具体流程如图2图3所示。

图2 ESS模式业务流程图
图3 RSS模式业务流程图

OmniShuffle Shuffle加速组件与Spark对接后,用户通过访问Spark的CLI可以查看集群的运行状态。管理员和运维人员可以通过OmniShuffle Shuffle加速组件的CLI查看集群的运行状态。

元数据服务由Driver启动,application之间隔离开来,只对当前应用服务。