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

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

3天内不再提示

使用fsspec优化对拼花地板数据的访问

星星科技指导员 来源:NVIDIA 作者:Rick Zamora 2022-05-13 15:15 次阅读

随着数据集规模的不断扩大,采用 Amazon S3 和谷歌云存储( GCS )等云存储平台变得越来越流行。尽管节点本地存储可能会带来更好的 IO 性能,但在数据集超过单 TB 规模后,这种方法可能变得不切实际。

在远程存储是唯一实用的解决方案的情况下, PyData 生态系统的许多部分已经采用文件系统规范(fsspec)作为通用文件系统 API 。自从s3fs和gcsfs推出以来,fsspec已经为用户提供了足够的远程存储访问权限,但内部字节传输和缓存算法还没有对拼花等高性能文件格式进行特定于格式的优化。

关键教训

在本文中,我们将介绍fsspec.parquet模块,它为远程拼花文件提供了一种支持格式的字节缓存优化。这个模块是实验性的,并且仅限于一个公共 API :open_parquet_file。

此 API 提供了更快的远程文件访问。与 cuDF 和 cuDF 数据帧库中的默认read_parquet行为相比,对于大型拼花地板文件的部分 I / O (列块和行组选择),整体吞吐量有了一致的性能提升。

我们还讨论了这个新模块中使用的优化,并给出了初步的性能结果。

什么是 fsspec ?

文件系统规范(fsspec)是一个开源项目,为各种后端存储系统提供统一的 Python 接口。fsspec对应于一个特定的fsspec Python 库和一个更大的 GitHub 组织,其中包含许多特定于系统的存储库(例如s3fs和gcsfs)。

在基于 Python 的库或应用程序中使用fsspec的优点是,类似于 POSIX 的文件 API 可以从远程对象和本地文件进行读写。当一个基于云的对象被一个fsspec兼容的文件系统打开时,底层应用程序会得到一个AbstractBufferedFile对象,或者其他一些类似文件的对象,这些对象被设计为使用原生 Python 文件对象进行 duck type 操作。现在,这些类似文件的对象可以像本地 Python 文件句柄一样处理。

一个明显的区别是AbstractBufferedFile对象必须在内部使用特定于文件系统的命令,以便向远程存储系统输入和从远程存储系统获取字节。由于内部数据传输操作的延迟通常高于本地磁盘访问,fsspec提供了几种缓存策略来预取数据,同时避免了许多小请求。

在这篇文章的后面,我们将解释为什么对于大型拼花地板文件,默认缓存策略通常不太理想,以及新的KnownPartsOfAFile(“部件”)选项如何显著减少读取延迟。

什么是拼花地板?

Parquet 是一种面向二进制列的数据存储格式,设计时考虑了性能、压缩和部分 I / O 。由于与 CSV 等文本格式文件相比具有显著的性能优势,自 2013 年首次发布以来,开源格式的受欢迎程度迅速增长。

为了理解 Fsspec 拼花地板模块中使用的优化,对拼花地板规范有一个高层次的理解是很有用的。图 1 显示,所有拼花文件都由一组连续存储的行组组成,而这些行组中的每一个都包括一组连续存储的列块。

poYBAGJ-BYaAA4RuAABh6cE49SQ695.png

图 1 拼花地板文件格式的高级视觉表示

总之,拼花地板文件中的大部分字节都对应于这些列块。剩余的字节用于将文件元数据存储在旧格式的页脚中。此页脚元数据包括文件中每个列块的字节偏移量和可选统计信息(min、max、valid count、null count)。

由于这些重要信息整合在页脚中,因此只需对拼花地板文件的结尾进行采样,即可确定文件中每个列块的具体位置。

fsspec 新拼花模块的用途是什么?

fsspec已经是 Python 下加载拼花地板文件的最常用方法。新fsspec.parquet模块的主要目的是为这项任务提供优化的实用程序。

在内部,这个新的实用程序(open_parquet_file)基本上将一个传统的开放调用封装在特定于拼花地板的逻辑中,该逻辑设计用于在用户启动显式读取操作之前,开始将所有相关数据从远程文件传输到本地内存。

尽管任何大小的读取都可能受益于此新实用程序,但当读取操作仅针对所有列和行组的子集时,可以看到最显著的改进。例如,当远程读取使用列投影时,相同的列列表可以直接传递给open_parquet_file:

from fsspec.parquet import open_parquet_file import pandas as pd path = “://my-bucket/my-data” columns = [“col1”, “col2”] options = {“necessary”: ”credentials”} with open_parquet_file( path, columns=columns, storage_options=options, ) as f: df = pd.read_parquet(path, columns=columns)

如前所述,fsspec新open_parquet_file函数的主要目的是通过在AbstractBufferedFile.open中使用支持格式的缓存策略,提高大型拼花地板文件的读取性能。

要理解拼花地板模块使用的特定优化为什么是有益的,首先了解简单的无缓存方法以及默认的预读策略是有帮助的。

了解无缓存和预读方法

图 2 显示了对于 naive 和 naive 读调用序列,无缓存文件访问可能如何映射到read_parquet操作中的远程 get 调用(在远程文件已经打开之后)。

OptimizeAccess_Pic2-625x359.png

图 2 从远程拼花文件比较理想和原始数据访问模式

在这个特定的示例中,假设拼花文件足够大(~ 400MB +)以包含四个不同的行组,read_parquet调用的目标是四个可用列中的两个。这意味着AbstractBufferedFile对象最终必须将八个不同的列块范围以及页脚元数据传输到本地内存中。

在禁用缓存的情况下,经过良好调整的拼花地板库可以使用五个不同的请求仅将必要的数据移动到本地内存中。然而,由于fsspec的类文件接口包含state,这五个读取调用始终是串行的,每次调用都会产生一整段延迟时间。

这种 ideal-access 场景无法利用并发性来最小化延迟,即使该策略可能会最小化文件系统请求的数量并产生高的总体吞吐量。对于采用 naive-access 方法且未明确最小化读取调用数的拼花地板库,read_parquet操作可能会出现高延迟和低总体吞吐量!

此时,我们已经确定,在文件已经打开进行读取之后, I / O 库无法利用文件系统的并发性。更重要的是,当涉及部分 I / O 时,默认的预读缓存策略可能会进一步降低观察到的性能。这是因为预读缓存的固有假设是,顺序文件访问可能是连续的。

Figure 3 shows that read-ahead caching is likely to transfer about 20 MB of unnecessary data, 5 MB of read-ahead for each row-group.

OptimizeAccess_Pic3-625x359.png

图 3 中预读和无缓存文件访问策略的比较 fsspec

正如您在以下性能结果中看到的,禁用缓存优于预读缓存的好处取决于read_parquet中使用的引擎和特定的存储系统。

如果引擎已经包含了支持格式的优化,可以将必要的字节范围移动到本地内存中(即pyarrow和fastparquet),那么无缓存选项可能是更好的选择。当引擎假定本地文件访问速度很快( cuDF )时,某种形式的fsspec级缓存可能非常关键。

在这两种情况下,引擎都无法开始传输所需的字节范围,直到创建fsspec文件对象之后。它受到顺序数据传输附加延迟的限制。

现在,我们已经对典型的 read _ parquet 调用中的默认和无缓存 AbstractBufferedFile 行为有了较高的理解,现在我们可以解释open_parquet_file为提高总体读取吞吐量而使用的两种通用优化。

优化 1 :使用“部件”缓存策略

默认情况下,与AbstractBufferedFile中使用的格式无关的缓存策略不同,您可以使用新的KnownPartsOfAFile(“部件”)选项在文件打开之前精确缓存所需内容。

from fsspec.parquet import open_parquet_file
import pandas as pd path = “://my-bucket/my-data”
columns = [“col1”, “col2”]
options = {“necessary”: ”credentials”} with open_parquet_file( path, columns=columns, storage_options=options,
) as f: df = pd.read_parquet(path, columns=columns)

图 4 显示,用于访问read_parquet中数据的逻辑与用于远程数据访问的get调用的数量或大小之间不再存在任何关系。从拼花引擎的角度来看,任何读取操作几乎都是瞬时的,因为所有必需的数据都已缓存在内存中。

OptimizeAccess_Pic4.png

图 4 这个 fsspec 的“部件”缓存策略。在打开类似文件的对象之前,所有必要的数据都必须缓存在本地内存中。

优化 2 :异步并行传输“部件”

尽管之前的优化使您能够避免read_parquet中的许多小型 get 操作和不必要的数据传输,但在初始化AbstractBufferedFile之前,您仍然必须填充KnownPArtsOfAFile缓存。

为了尽可能高效地执行此操作,请使用cat_ranges一次性获取所有必需的列块,包括异步获取和使用asyncio并行获取。因为对于包含多个字段或多个行组的文件,传输的列块的总数可能很大,所以只要聚合的请求的大小保持在上限以下,就可以聚合相邻的字节范围请求。

图 5 显示,这种方法最终会导致并发传输多个字节范围的最佳大小。

OptimizeAccess_Pic5-625x518.png

图 5中使用的数据传输优化 fsspec.parquet

初步 fsspec 。拼花地板基准测试结果

要将open_parquet_file的性能与其他基于fsspec和pyarrow的文件处理方法进行比较,请使用 可用 Python 脚本 :

pyarrow-6.0.1

fastparquet-0.8.0

cudf-22.04

fsspec/s3fs/gcfs-2022.2.0

使用这个脚本,我们从一个 789M 的拼花地板文件中读取一列,该文件共包含 10 个行组和 30 个列,具有快速压缩,需要传输大约 27M 的数据。图 6-7 中总结的 S3 和 GCS 的结果清楚地表明,当从默认缓存策略转向open_parquet_file时,性能显著提升 85% 或更高。

事实上,新功能有效地匹配了 PyArrow 的原生S3FileSystem实现的性能,该实现是专门为其镶木地板引擎的最佳性能而设计的。在本文中,我们仅将其与 Amazon S3 基准测试的本机 PyArrow 文件系统进行比较,因为 PyArrow 在发布时仅提供 Amazon S3 和 Hadoop 的公共支持实现。

OptimizeAccess_Pic6-625x387.png

图 6 S3 存储的一般基准测试结果

OptimizeAccess_Pic7-625x387.png

图 7 GCS 存储的一般基准测试结果

为了说明使用open_parquet_file缩放文件的好处,我们还从一个 12 GB 的拼花地板文件中读取了一列,其中包含禁用压缩的公共 GCS 存储中 Criteo 数据集的第一天。图 8 显示,新的fsspec函数可以提供比默认缓存 10 倍或更多的加速。

OptimizeAccess_Pic8-625x389.png

图 8 地面军事系统存储的 Criteo 数据集基准测试结果

自己测试一下

在本文中,我们介绍了fsspec.parquet模块,它为打开远程拼花文件open_parquet_file提供了一种支持格式的字节缓存优化。基准测试清楚地表明,与fsspec中的默认文件打开行为相比,新的优化可以提供显著的性能改进,甚至可以接近 PyArrow 中针对部分 I / O 的优化 C ++文件系统实现的性能。

自从在 2021.11.0 版本的 fsspec 中正式发布以来,open_parquet_file实用程序已经被 RAPIDS cuDF 库和 Dask -Dataframe 采用。

由于基于 cuDF 的工作流得到了显著且一致的改进,此新功能已被cudf.read_parquet和dask_cudf.read_parquet采用为默认的文件打开方法。

对于没有 GPU 资源的 Dask 用户,现在可以通过向read_parquet传递open_file_options参数来选择优化的缓存方法。例如,以下代码示例指示 Dask 使用parquet预缓存方法打开所有拼花地板数据文件:

import dask.dataframe as dd ddf = dd.read_parquet( path, open_file_options={“precache_options”: {“method”: “parquet”}}
)

鉴于这一早期的成功,我们希望扩展和简化fsspec中可用的预缓存选项,并在所有文件打开函数中建立一个清晰的 precache_options API 。

关于作者

Rick Zamora 是 NVIDIA 在 RAPIDS 和 Dask 工作的高级软件工程师。他有科学计算研究和并行软件开发的背景。杜兰特博士在牛津大学学习物理学,在多伦多学习天体物理学。他在多个波长和广泛的时间尺度上研究了脉冲星和其他紧凑型物体系统。

审核编辑:郭婷

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

    关注

    33

    文章

    8605

    浏览量

    151178
  • API
    API
    +关注

    关注

    2

    文章

    1501

    浏览量

    62027
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84694
收藏 人收藏

    评论

    相关推荐

    如何PC访问内网及VPN

    访问VPN的工作原理
    发表于 12-23 15:07 1次下载

    SSM框架的性能优化技巧 SSM框架中RESTful API的实现

    : 缓存可以显著提高系统的响应速度。 在SSM中,可以使用Redis或Memcached等缓存技术来缓存频繁访问数据,如数据库查询结果、用户信息等。 同时,也可以利用Spring Cache抽象层来简化
    的头像 发表于 12-17 09:10 169次阅读

    如何优化EEPROM的数据存储策略

    。它广泛应用于需要存储少量数据的场合,如微控制器、传感器和嵌入式系统中。优化EEPROM的数据存储策略可以提高数据的可靠性、延长存储器的使用寿命,并提高
    的头像 发表于 12-16 17:21 397次阅读

    如何进行ASIC集成电路性能优化

    : 一、电路设计优化 流水线技术 :通过将复杂的计算任务分解为多个简单的子任务,并在不同的时钟周期内并行处理,可以显著提高电路的性能。 并行处理技术 :利用多个处理单元同时处理数据,提高数据处理速度和吞吐量。
    的头像 发表于 11-20 15:52 458次阅读

    IP在线代理指南:选择、使用与优化技巧

    在数字时代,IP在线代理成为了我们访问全球互联网资源的重要工具。通过选择合适的代理服务器,我们不仅能够突破地域限制,还能提高访问速度,保护个人隐私。然而,如何正确选择、使用和优化IP在线代理,却是一门需要掌握的技巧。
    的头像 发表于 11-16 16:41 342次阅读

    如何优化emc存储性能

    在当今的数据中心环境中,存储性能对于业务连续性和数据访问速度至关重要。EMC作为领先的存储解决方案提供商,其产品线涵盖了从入门级到企业级的存储系统。然而,即使是最好的存储系统也需要定期优化
    的头像 发表于 11-01 15:57 290次阅读

    HTTP海外访问优化:提升跨国网络性能的秘诀

    HTTP海外访问优化是提升跨国网络性能的关键,涉及多个方面的技术和策略。
    的头像 发表于 10-15 08:04 329次阅读

    优化HTTP海外访问:技术挑战与解决方案

    优化HTTP海外访问需要从多个方面入手,包括使用CDN加速、部署代理服务器或VPN、优化网络路由、采用高效的网络协议、加强数据安全与隐私保护以及选择可靠的云服务提供商等。
    的头像 发表于 09-25 08:08 252次阅读

    工业交换机如何保证数据访问安全

    在现代工业自动化环境中,工业交换机作为关键的网络设备,扮演着数据传输和信息交互的重要角色。为了确保数据访问安全,工业交换机不仅具备高效的转发性能,还集成了多层次的安全防护机制,以抵御各种潜在的网络威胁。
    的头像 发表于 09-19 16:18 227次阅读
    工业交换机如何保证<b class='flag-5'>数据</b>的<b class='flag-5'>访问</b>安全

    探讨篇(四):分布式数据访问解决方案

    背景 如果数据在同一个服务的同一个数据库,通过SQL即可查询相对比较简单,但当数据被分布到不同服务不同的数据库中时,访问组合
    的头像 发表于 07-12 15:19 358次阅读
    探讨篇(四):分布式<b class='flag-5'>数据</b><b class='flag-5'>访问</b>解决方案

    鸿蒙开发Ability Kit程序框架服务:访问控制概述 程序访问控制

    默认情况下,应用只能访问有限的系统资源。但某些情况下,应用存在扩展功能的诉求,需要访问额外的系统数据(包括用户个人数据)和功能,系统也必须以明确的方式对外提供接口来共享其
    的头像 发表于 07-01 15:53 298次阅读
    鸿蒙开发Ability Kit程序框架服务:<b class='flag-5'>访问</b>控制概述 程序<b class='flag-5'>访问</b>控制

    FPGA实现SDIO访问需要注意的问题

    FPGA实现SDIO访问时,需要注意以下几个关键问题和细节: 初始化过程: SDIO总线的初始化是确保FPGA与SD卡能够正常通信的第一步。这包括设置时钟频率、配置数据传输模式以及校验协议等
    发表于 06-27 08:38

    “白地板”方案,智算中心加速器

    明德源能白地板方案,智算中心加速器
    的头像 发表于 06-21 11:54 798次阅读

    SD-WAN技术:优化国内外服务器访问的关键

    新的解决方案,以优化国内外服务器的访问。本文将探讨SD-WAN的作用以及它是如何加速国外服务器访问的。 一、SD-WAN的作用 SD-WAN是一种新兴的网络技术,它通过智能化的网络管理和加速功能,解决了传统网络架构在
    的头像 发表于 02-27 16:33 437次阅读

    西门子博途示例:设置优化访问

    默认情况下,为 S7 - 1200/1500 的所有新创建的块启用优化访问。可为 OB、FB 和全局DB设置块访问。对于背景DB,设置来自各自的 FB。 如果将块从 S7- 300/400 控制器移植到 S7- 1200/1
    的头像 发表于 01-15 10:41 5803次阅读
    西门子博途示例:设置<b class='flag-5'>优化</b>块<b class='flag-5'>访问</b>