0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用NVIDIA GPU加速Apache Spark中Parquet数据扫描

NVIDIA英伟达企业解决方案 ? 来源:NVIDIA英伟达企业解决方案 ? 2025-07-23 10:52 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着各行各业的企业数据规模不断增长,Apache Parquet 已经成为了一种主流数据存储格式。Apache Parquet 是一种列式存储格式,专为高效的大规模数据处理而设计。它按列而非按行的方式组织数据,这使得 Parquet 在查询时仅读取所需的列,而无需扫描整行数据,即可实现高性能的查询和分析。高效的数据布局使 Parquet 在现代分析生态系统中成为了受欢迎的选择,尤其是在 Apache Spark 工作负载中。

适用于 Apache Spark 的 RAPIDS 加速器基于 cuDF 构建,支持 Parquet 数据格式,可在 GPU 上加速读取和写入数据。对于许多输入数据量达到 TB 级别的大规模 Spark 工作负载而言,高效的 Parquet 扫描对于实现良好的运行时性能至关重要。

本文将讨论如何缓解因较高的寄存器使用率导致的占用限制问题,并分享基准测试结果。

Apache Parquet 数据格式

Parquet 文件格式采用列式存储结构,通过将列线程块组装成行组来实现数据存储。其中元数据不同于数据,可以根据需要拆分到多个文件中(如图 1 所示)。

9b9c45c2-66e4-11f0-a6aa-92fbcf53809c.png

图 1. Parquet 文件格式(来源:文件格式)

Parquet 格式支持多种数据类型。元数据规定了该如何解释这些数据类型,从而能够支持更复杂的逻辑类型表示,比如时间戳、字符串、小数等等。

元数据还可以用于说明更复杂的结构,如嵌套类型和列表。数据可以用多种不同的格式进行编码,例如普通值、字典编码、行程长度编码、位打包(bit-packing)等等。

9baa2836-66e4-11f0-a6aa-92fbcf53809c.png

GPU 上 Parquet 的占用限制

在适用于 Apache Spark 的 RAPIDS 加速器之前,Parquet 扫描是通过一个单一 cuDF 内核实现的,它在一组处理代码中支持所有 Parquet 列类型。

使用 Parquet 数据的客户越来越多地在 GPU 上采用 Spark。鉴于 Parquet 扫描对性能有关键影响,人们投入了更多时间来了解其性能特征。以下是几个会影响内核运行效率的常见因素:

流式多处理器(SM):GPU 的主要处理单元,负责执行计算任务。

共享内存:GPU 上集成的内存,按线程块分配,同一线程块中的所有线程都可以访问相同的共享内存。

寄存器:GPU 上集成的快速内存,存储单个线程使用的信息,用于流式多处理器执行的计算操作。

我们在分析 Parquet 扫描时发现,由于遇到寄存器限制,GPU 的总体占用率低于预期。寄存器的使用情况,取决于 CUDA 编译器如何根据内核逻辑和数据管理来生成代码。

对于 Parquet 单内核而言,支持所有列类型的复杂性导致了内核庞大且复杂,其共享内存和寄存器使用率都很高。尽管单一内核可能将代码整合在了一起,但其复杂性限制了可能的优化类型,并在大规模应用时导致了性能受限。

9bc8955a-66e4-11f0-a6aa-92fbcf53809c.png

图 2. GPU 上的 Parquet 单内核

图 2 展示了 GPU 上的 Parquet 数据处理循环。每个模块都是大量复杂的内核代码,可能都有各自的共享内存需求。许多线程块依赖于数据类型,这导致加载到内存中的内核变得极为臃肿。

具体而言,其中一个限制在于 Parquet 块在线程束(warp)内的解码方式。线程束在处理自身线程块前,需要按顺序等待先前调度的线程束完成操作。这种机制虽然允许不同线程束并行处理解码过程的不同阶段,但却造成了 GPU 上引入了低效的任务依赖关系,导致效率低下。

转向采用块级解码算法对提升性能至关重要,但由于其增加了数据共享和同步的复杂性,可能会进一步增加寄存器数量并限制占用率。

cuDF 中的 Parquet 微内核

为了缓解因寄存器使用率较高而导致的占用受限问题,最初尝试的方法是为 Parquet 中的预处理列表类型数据创建一个较小的内核。从单内核中分离出一段代码,形成一个独立的内核,结果令人振奋——基准测试的整体结果显示运行时间更快,并且 GPU 跟踪数据也表明占用率有所提高。

随后对不同的列类型也采用了相同的方法。针对各种数据类型的微内核使用 C++ 模板来实现功能复用,这简化了每种类型的代码维护和调试工作。

9bea1ac2-66e4-11f0-a6aa-92fbcf53809c.png

图 3. GPU 上的 Parquet 微内核方法

Parquet 微内核方法充分利用编译时优化,仅执行处理给定类型所需的代码路径。与包含所有可能代码路径的单一内核不同,该方法可以生成许多单独的微内核,而每个微内核仅包含该路径所需的代码。

这一过程可以通过在编译时使用 if constexpr 来实现。这样一来,使得代码保持自然可读的结构,但不会包含特定数据属性组合(字符串或固定宽度、有列表或无列表等)永远不会执行的代码路径。

以下是一个处理固定宽度类型列的简单示例。可以看到,在新的微内核方法中,大部分不必要的处理步骤都被跳过了。这种数据类型只需要复制数据。

9bfc8fa4-66e4-11f0-a6aa-92fbcf53809c.png

图 4.固定宽度类型的 Parquet 微内核方法

为了解决线程束之间的瓶颈问题,新的微内核使每个步骤都能处理整个线程块,使得线程束可以更高效地独立处理数据。这对于字符串处理尤为重要,它使得 GPU 上包含 128 个线程的完整线程块都能用于复制字符串,而之前的实现方式仅使用一个线程束来复制字符串。

在使用了一块具有 24 GB GPU 显存的 NVIDIA RTX A5000 显卡的本地基准测试中,设备缓冲区中预先加载了 512MB 使用 Snappy 压缩的 Parquet 数据。为了测试分块读取,每次读取 500-KB 的块。测试数据包含以下几种变化:

基数为 0 和 1000

运行长度为 1 和 32

1% 的空值

如果数据有重复,则使用自适应字典编码

图 5 展示了在 GPU 上使用新的微内核方法后,不同 Parquet 列类型在吞吐量方面的提升情况。

9c31a446-66e4-11f0-a6aa-92fbcf53809c.png

图 5. GPU 上使用 Parquet 微内核方法的吞吐量提升

对列表列分块读取的优化还使 500-KB 读取的吞吐量提高了 117%。

在 GPU 上开始使用 Apache Spark

Parquet 是一种广泛用于大数据处理的关键数据格式。通过使用 cuDF 中经过优化的微内核,GPU 可以加速在 Apache Spark 中扫描 Parquet 数据的进程。

企业可以利用适用于 Apache Spark 的 RAPIDS 加速器,将 Apache Spark 工作负载无缝迁移到 NVIDIA GPU。适用于 Apache Spark 的 RAPIDS 加速器结合了 RAPIDS cuDF 库的强大功能和 Spark 分布式计算框架的规模,利用 GPU 加速处理。通过使用适用于 Apache Spark 的 RAPIDS 加速器插件 JAR 文件启动 Spark,无需更改代码即可在 GPU 上运行现有的 Apache Spark 应用程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 加速器
    +关注

    关注

    2

    文章

    828

    浏览量

    39153
  • 数据
    +关注

    关注

    8

    文章

    7259

    浏览量

    92060
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4956

    浏览量

    131440

原文标题:使用 GPU 加速 Apache Spark 上的 Apache Parquet 扫描

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RDMA技术在Apache Spark的应用

    背景介绍 在当今数据驱动的时代,Apache?Spark已经成为了处理大规模数据集的首选框架。作为一个开源的分布式计算系统,Spark因其高
    的头像 发表于 03-25 18:13 ?1893次阅读
    RDMA技术在<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b><b class='flag-5'>中</b>的应用

    《CST Studio Suite 2024 GPU加速计算指南》

    的各个方面,包括硬件支持、操作系统支持、许可证、GPU计算的启用、NVIDIA和AMD GPU的详细信息以及相关的使用指南和故障排除等内容。 1. 硬件支持 - NVIDIA
    发表于 12-16 14:25

    基于Spark 2.1版本的Apache Spark内存管理

    Apache Spark 内存管理详解
    发表于 04-26 17:13

    基于Apache Spark 的下一波智能应用

    基于Apache Spark 的下一波智能应用
    发表于 12-28 11:07 ?0次下载

    如何使用Apache Spark 2.0

    Spark 2.0使用DataFrames和SQL的第一步 Spark 2.0开发的一个动机是让它可以触及更广泛的受众,特别是缺乏编程技能但可能非常熟悉SQL的数据分析师或业务分析师
    发表于 09-28 19:00 ?0次下载
    如何使用<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b> 2.0

    Apache Spark 1.6预览版新特性展示

    日前,Databricks公司发布了一个Apache Spark主要版本的可用性。除了可用性、可移植性等几个新的特性外,本次发布还提供了对尚未发布的Apache Spark 1.6预览
    发表于 10-13 11:21 ?0次下载
    <b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b> 1.6预览版新特性展示

    Apache Spark上的分布式机器学习的介绍

    Apache Spark上的分布式机器学习
    的头像 发表于 11-05 06:31 ?3228次阅读

    NVIDIA为全球领先的数据分析平台Apache Spark提速

    NVIDIA企业计算主管Manuvir Das表示:“数据分析是当今企业和研究者所面临最大的高性能计算挑战。从ETL到训练再到推理,整个Spark 3.0 方案的原生GPU
    的头像 发表于 05-15 15:48 ?2477次阅读

    Apache Spark 3.2有哪些新特性

    经过七轮投票, Apache Spark 3.2 终于正式发布了。Apache Spark 3.2 已经是 Databricks Runtime 10.0 的一部分,感兴趣的同学可以去
    的头像 发表于 11-17 14:09 ?2024次阅读

    NVIDIA RAPIDS加速器可将工作分配集群各节点

    近期,该团队在 GPU 助力的服务器上测试了适用于 Apache SparkNVIDIA RAPIDS 加速器,该软件可将工作分配到集
    的头像 发表于 04-01 14:15 ?1439次阅读

    利用Apache Spark和RAPIDS Apache加速Spark实践

      在第三期文章,我们详细介绍了如何充分利用 Apache SparkApache RAPIDS 加速
    的头像 发表于 04-26 17:39 ?2183次阅读
    利用<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b>和RAPIDS <b class='flag-5'>Apache</b><b class='flag-5'>加速</b><b class='flag-5'>Spark</b>实践

    使用Apache SparkNVIDIA GPU加速深度学习

      随着人们对深度学习( deep learning , DL )兴趣的日益浓厚,越来越多的用户在生产环境中使用 DL 。由于 DL 需要强大的计算能力,开发人员正在利用 gpu 来完成他们的训练和推理工作。
    的头像 发表于 04-27 09:54 ?2545次阅读
    使用<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b>和<b class='flag-5'>NVIDIA</b> <b class='flag-5'>GPU</b><b class='flag-5'>加速</b>深度学习

    Spark ML算法提供GPU加速

    新的 GPU 库降低了 Apache Spark ML 的计算成本
    的头像 发表于 07-05 16:30 ?1047次阅读
    为<b class='flag-5'>Spark</b> ML算法提供<b class='flag-5'>GPU</b><b class='flag-5'>加速</b>度

    NVIDIA TensorRT与Apache Beam SDK的集成

    使用 NVIDIA TensorRT 在 Apache Beam 简化和加速机器学习预测
    的头像 发表于 07-05 16:30 ?729次阅读

    NVIDIA加速Apache Spark助力企业节省大量成本

    随着 NVIDIA 推出 Aether 项目,通过采用 NVIDIA 加速Apache Spark 企业得以自动
    的头像 发表于 03-25 15:09 ?574次阅读
    <b class='flag-5'>NVIDIA</b><b class='flag-5'>加速</b>的<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b>助力企业节省大量成本