简介: Spark SQL 作为 Spark 用来解决结构化数据的一个根本模块,曾经成为少数企业构建大数据利用的重要抉择。然而,在大规模连贯(Join)、聚合(Aggregate)等工作负载下,Spark 性能会面临稳定性和性能方面的挑战。
Spark SQL 作为 Spark 用来解决结构化数据的一个根本模块,曾经成为少数企业构建大数据利用的重要抉择。然而,在大规模连贯(Join)、聚合(Aggregate)等工作负载下,Spark 性能会面临稳定性和性能方面的挑战。

为了晋升 Spark SQL 的性能,用户能够抉择应用英特尔® 优化剖析包(Optimized Analytics Package,OAP)以及英特尔® 傲腾™ 长久内存和新一代英特尔® 至强® 处理器来改善典型 Spark SQL 工作负载的运行效率。

Spark SQL 面临多场景性能瓶颈

IDC 报告显示,寰球数据规模将从2019年的45 ZB 增长到2025年的175 ZB ,2020年创立、捕捉和耗费的数据量预计过 59 ZB。在数据疾速挪动、迅猛增长的趋势下,企业须要应用先进的剖析技术来实时处理数据以取得实时的业务洞察力。大数据分析技术的新倒退与革命性新硬件的问世,显著进步了大数据分析性能,使得数据科学家、分析师和业务用户可能取得更粗浅的业务洞察。

作为面向大规模数据处理而设计的疾速通用的计算引擎,Spark 具备开源、经济、灵便等长处,罕用来构建大型、低提早的数据分析应用程序。然而,Spark 在特定场景下仍然会面临性能挑战,特地是当解决特大规模数据及交互式查问时。例如,因为短少高性能缓存计划,数据 I/O 很容易成为瓶颈。此外,Spark Shuffle 也经常因为大量的较小随机磁盘 IO、序列化、网络数据传输成为性能瓶颈,导致作业提早大幅减少,进而影响工作负载性能。

新兴的硬件技术能够帮忙解决这些挑战。例如,高级矢量扩大(AVX)性能使 Spark 可能利用 SIMD 同时解决更多的数据来放慢执行速度,而英特尔® 傲腾™ 长久内存能够利用其高性能,大容量和低提早翻新的突破性组合来进步 Spark SQL 性能。OAP(优化剖析包)是英特尔和社区开发的一个开源我的项目,旨在借助先进的英特尔处理器、内存和存储以及网络技术,通过数据源缓存、SQL 索引、Native SQL 引擎、MLlib 优化等翻新软件性能进步 Spark 性能,以解决 Spark 外围和相干组件面临的计算和 I/O挑战。

英特尔 Spark 优化剖析包(OAP)

英特尔® 优化剖析包(OAP)是英特尔和社区开发的开源我的项目,旨在进步 Spark 性能。它基于先进的英特尔硬件技术,提供了多种性能来改善 Spark 高速缓存、Shuffle、执行和机器学习性能。如下图1显示了 OAP 架构,它包含以下组件:OAP 数据源高速缓存、Native SQL 引擎、Arrow 数据源、OAP MLlib、RDD 高速缓存、RPMem Shuffle 和远端 Shuffle。

  • SQL 数据源高速缓存: 一种优化的扩大包,通过在 Spark SQL 数据源层应用高速缓存技术来晋升 Spark SQL 性能。
  • Native 执行引擎: Spark SQL 的 Native 引擎将 Spark 行数解决转为列式解决,并借助矢量化 SIMD 以及 Arrow 数据格式进行减速。
  • MLlib: Vanilla Spark MLlib 的代替版本,通过oneDAL、oneMKL 和 oneCCL 进行了优化。
  • RDD 高速缓存、RPMem Shuffle 等性能:通过借助长久内存的大容量、高性能等特点来防止存储溢出(包含 RDD 高速缓存、溢出、两头数据),进步 Spark 性能。
  • 远端 Shuffle: 反对远端 Shuffle 和基于长久内存的 Shuffle。


(图1)

OAP 数据源高速缓存

数据源高速缓存(SQL DataSource Cache)旨在利用用户定义的索引和智能细粒度内存数据高速缓存来进步 Spark SQL 性能(如图2所示),次要目标是解决交互式查问和批处理作业的性能问题。


(图2)

交互式查问

大多数用户应用 Spark SQL 作为批处理引擎。但作为一个对立解决引擎,很难与非批处理辨别。交互式查问须要在几秒、甚至几亚秒内返回数据,而非批处理所需的几分钟、甚至几小时。这对于以后的 Spark SQL 数据处理来说是一个很大的挑战。交互式查问通常解决较大的数据集,但在通过特定条件过滤后只返回一小部分数据。通过为要害列创立和存储残缺的 B+ 树索引,并应用智能细粒度内存数据高速缓存策略,Spark SQL 交互式查询处理工夫能够显著缩短。

批处理作业

对于在数据仓储中应用 Spark SQL 进行业务剖析的用户,OAP SQL 数据源高速缓存能够通过两种可配置的高速缓存策略来减速批处理作业:

• 主动高速缓存热数据。

• 专门高速缓存热表。

SQL 索引和数据源高速缓存为不同列式存储格局提供对立的高速缓存示意模式,并设计了针对 RowGroup 中单列的细粒度高速缓存单元。同时,它为两种列存储文件格式 Parquet 和 ORC 设计了兼容的适配器层,索引和高速缓存都构建在对立示意模式和适配器之上。

OAP 数据源高速缓存架构设计

数据源高速缓存能够高速缓存已解压缩和已解码的矢量化数据以及二进制原始数据。一般来说,DRAM 通常在 Spark 集群中用作高速缓存介质,但在 OAP 数据源高速缓存中,英特尔® 傲腾™长久内存也能够用作高速缓存介质,以提供高性能、高老本效益的高速缓存解决方案。如下图3显示了英特尔® 傲腾™ 长久内存用作高速缓存介质时的 OAP 数据源高速缓存的架构设计。


(图3)

OAP 数据源高速缓存提供以下次要性能:

  • 笼罩内置的 Parquet/ORC 文件格式。
  • 在分布式集群中提供本地 cache(须要内部 KV 存储以反对元数据持久性)。
  • NUMA 绑定以提供更高性能(若启用英特尔® 傲腾™ 长久内存的 snoopy 模式,则不须要 NUMA 绑定)。
  • 基于 Plasma 的实现,从而反对多个 spark 执行单元同时拜访缓存。

OAP RPMem Shuffle

Spark 旨在为不同的工作负载(如即席查问、实时流和机器学习)提供高吞吐量和低提早的数据处理。然而,在某些工作负载(大规模数据连贯/聚合)下,因为 Shuffle 须要在本地 Shuffle 磁盘读取/写入两头数据并将其通过网络传输,Spark 可能会呈现性能瓶颈。英特尔® 傲腾™ 长久内存是一种创新型内存技术,相较于 DRAM,其在等同价位下个别可提供更大的容量,并且反对数据的持久性。同时,近程间接内存拜访(RDMA)技术支持在不同计算机之间进行独立于操作系统的间接内存拜访,从而提供高吞吐量、低提早的网络性能。应用高性能英特尔® 傲腾™ 长久内存和 RDMA 网络能够帮忙在肯定水平上化解 Shuffle 挑战。

OAP RPMem Shuffle 提供了一个名为 RPMem Shuffle 扩大的可插拔模块,该模块可通过批改配置文件笼罩默认的 Spark Shuffle 管理器,无需更改 Spark 代码即可应用。应用此扩大,Spark shuffle 能够充分利用英特尔® 傲腾™ 长久内存和 RDMA Shuffle 解决方案,相较于传统的基于磁盘的 shuffle 形式,能够显著进步 Shuffle 性能。

OAP RPMem Shuffle 架构设计

如前文所述,Spark Shuffle 是一项老本昂扬的操作,须要大量的小型随机磁盘 IO、序列化、网络数据传输等步骤,因而会大幅减少作业提早,并且很容易成为工作负载性能的瓶颈。通常,Spark Shuffle 将从底层存储加载数据并作为 Mapper 的输出,而后 Mapper 将依据某种规定解决数据,例如依据特定的 Key 将数据分组到不同的分区中。每个 Mapper 的输入都会长久化到本地存储中,即 Shuffle 写操作。而后 Reducer 会尝试读取不同 Mapper 的输入数据,即 Shuffle 读操作,再将读入的数据进行排序等聚合操作,并最终输入后果。能够看到,一个经典的 Shuffle 操作包含数据在磁盘的读写和在网络的传输,而这二者在大数据集下都可能成为工作负载的性能瓶颈。

OAP RPMem Shuffle 旨在解决 Shuffle 瓶颈。如下图4所示,OAP RPMem Shuffle 能够通过附加库的模式笼罩现有的 Spark Shuffle 实现。在底层,它应用英特尔® 傲腾™ 长久内存作为 Shuffle 介质,并在用户空间通过 libpmemobj 对英特尔® 傲腾™长久内存进行拜访,作为 PMDK 的重要组件,libpmemobj 在英特尔® 傲腾™ 长久内存上提供了事务对象存储。OAP RPMemShuffle 扩大应用 Java Native Interface 对 libpmemobj 进行封装,并通过 Spark Shuffle Manager 以插件的形式接入Spark。


(图4)

RDMA 网卡是 RPMem Shuffle 扩大的可选项,它能够减少网络带宽,升高网络提早和通信节点的 CPU 利用率。HPNL4 作为一款高性能网络库,反对各种网络协议,如 TCP/IP、RoCE、iWRAP、OPA 等,它为 RPMem Shuffle 提供网络通信反对。如下图5显示了 Vanilla Spark Shuffle 和 OAP RPMem Shuffle 的设计。


(图5)

在 Vanilla Spark Shuffle 设计中,须要首先将数据序列化到堆外内存,而后写入机械硬盘或固态盘上的本地文件系统,并最终通过 TCP-IP 网络传输数据。这一过程波及大量上下文切换和文件系统开销,因而如果不对当初的 Spark shuffle 实现进行更改,就无奈充分利用英特尔® 傲腾™ 长久内存的能力。

OAP RPMem Shuffle 应用 libpmemobj 库将数据间接写入英特尔® 傲腾™ 长久内存,而后通过将 RDMA 内存区域注册在英特尔® 傲腾™ 来传输数据。此实现计划缩小了上下文切换开销,打消了文件系统开销,并可充分利用 RDMA 实现零拷贝来进一步升高提早和 CPU 利用率。

原文链接
本文为阿里云原创内容,未经容许不得转载。