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

    文章

    9444

    浏览量

    156136
  • API
    API
    +关注

    关注

    2

    文章

    2147

    浏览量

    66226
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    程序运行速度很慢如何优化

    ,考虑内联(inline)。 优化数据结构: 使用更高效的数据结构(如用查表代替复杂计算)。对齐数据访问。 编译器
    发表于 11-17 06:12

    内存与数据处理优化艺术

    事务数量,更好地利用CPU缓存。测试表明,在处理大量数据(如20MB)时,这种优化可能带来数倍的性能提升。
    发表于 11-14 07:46

    通过优化代码来提高MCU运行效率

    。 内存访问优化 充分利用缓存:如果MCU有Cache,尽量保证代码和数据的局部性,即让相关的数据在内存中连续存放。 避免内存碎片:在动态内存分配受限的系统中,尽量使用静态分配。 对
    发表于 11-12 08:21

    远程访问NAS不折腾,轻松获取固定访问地址!

    对于自建NAS(如FreeNAS、TrueNAS、Unraid)或品牌NAS(群晖、铁威马、威联通、华芸、绿联、极空间等)用户而言,外出时如何快速、安全地远程访问存储数据,一直是大家的核心需求
    的头像 发表于 09-02 19:20 485次阅读
    远程<b class='flag-5'>访问</b>NAS不折腾,轻松获取固定<b class='flag-5'>访问</b>地址!

    高架地板和华夫孔的比较分析-江苏泊苏系统集成有限公司

    在最初电子工厂洁净室系统中,尤其是在电子平板显示器件洁净室中,因为洁净室洁净程度相对较高,需要在洁净室里设置垂直通风系统结构。在最初洁净室系统中,地面结构通常设置成高架地板支撑系统,主要是通过可调
    的头像 发表于 08-12 15:24 774次阅读
    高架<b class='flag-5'>地板</b>和华夫孔的比较分析-江苏泊苏系统集成有限公司

    施工安全系类半导体晶圆制造高架地板开孔-江苏泊苏系统集成有限公司

    施工安全系类半导体晶圆制造高架地板开孔-江苏泊苏系统集成有限公司1,使用专用工具打开高架地板2,打开高架地板前应设置硬围护(钢性),围护上悬挂相应的安全警示标识并配置专职监护人3,对照《高架开孔作业
    的头像 发表于 06-13 14:36 709次阅读
    施工安全系类半导体晶圆制造高架<b class='flag-5'>地板</b>开孔-江苏泊苏系统集成有限公司

    解开半导体晶圆厂高架地板的面纱-江苏泊苏系统集成有限公司

    高架地板又叫做耗散型静电地板。当它接地或连接到任何较低电位点时,使电荷能够耗散,以电阻在10的5次方到10的9次方欧姆之间为特征。
    的头像 发表于 05-28 13:59 539次阅读
    解开半导体晶圆厂高架<b class='flag-5'>地板</b>的面纱-江苏泊苏系统集成有限公司

    10万用户见证!树莓派 Connect 正式版发布:远程访问功耗直降50%!

    树莓派官方宣布其远程连接服务RaspberryPiConnect正式结束测试阶段:优化后的远程访问功能更简单、更强大!
    的头像 发表于 05-12 15:49 735次阅读
    10万用户见证!树莓派 Connect 正式版发布:远程<b class='flag-5'>访问</b>功耗直降50%!

    “RdbStore”上线开源鸿蒙社区 助力鸿蒙应用数据访问效率大幅提升

    、品质调优、全链路运维等,能够有效提升应用启动和访问速度,助力应用高效开发和性能提升。 性能强大:数据访问和初始化耗时大幅优化 在应用开发过程中,
    的头像 发表于 03-18 15:02 546次阅读

    SQLite数据访问组件

    SQLite 数据访问组件 SQLite 数据访问组件 (LiteDAC) 是一个组件库 它提供从 Delphi 和 C++ Builder 到 SQLite 的原生连接,包括 Com
    的头像 发表于 02-08 11:48 820次阅读
    SQLite<b class='flag-5'>数据</b><b class='flag-5'>访问</b>组件

    机房施工—机房吊顶与静电地板怎样安装?

    为了满足机房的高效、稳定运行,吊顶和静电地板的安装成为机房建设的关键环节。下面聊一下机房吊顶与静电地板的安装施工方案。 吊顶安装: 1、材料选择:选用轻钢龙骨、石膏板等符合国家标准的材料,确保
    的头像 发表于 02-07 19:00 617次阅读
    机房施工—机房吊顶与静电<b class='flag-5'>地板</b>怎样安装?

    InterBase和Firebird数据访问组件介绍

    InterBase 和 Firebird 数据访问组件 InterBase(和 Firebird)数据访问组件 (IBDAC) 是一个库 提供与 InterBase 和 Firebir
    的头像 发表于 01-23 11:50 920次阅读
    InterBase和Firebird<b class='flag-5'>数据</b><b class='flag-5'>访问</b>组件介绍

    地板 “发电” 这事儿靠谱吗?

    “ 最近抖音和B站上有一个地板发电的视频很火:只要在步行道上铺设地板,每当有人经过,就可以源源不断地产生电能。走路越多,发电量越大。今天就给大家扒一下,这事儿究竟是否靠谱。 ” 带有 “黑
    的头像 发表于 01-06 11:20 1082次阅读

    通过Skyvia Connect SQL终端节点访问任何数据

    通过 Skyvia Connect SQL 终端节点访问任何数据   通过 Skyvia Connect SQL 终端节点访问任何数据ADO.NET
    的头像 发表于 01-02 09:31 592次阅读
    通过Skyvia Connect SQL终端节点<b class='flag-5'>访问</b>任何<b class='flag-5'>数据</b>

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

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