常见问题
通用问题
Apache Arrow 是什么?
Apache Arrow 是一个多语言工具箱,用于构建处理和传输大型数据集的高性能应用程序。它旨在提高分析算法的性能以及将数据从一个系统(或编程语言)移动到另一个系统的效率。
Apache Arrow 的一个关键组成部分是其内存中列式格式,这是一种标准化的、与语言无关的规范,用于在内存中表示结构化的、类似表格的数据集。这种数据格式具有丰富的数据类型系统(包括嵌套和用户定义的数据类型),旨在支持分析型数据库系统、数据帧库等的需求。
该项目还包含多种语言的 Arrow 列式格式实现,以及用于读写多种常见存储格式的实用工具。这些官方库使第三方项目能够使用 Arrow 数据,而无需自己实现 Arrow 列式格式。对于那些只想实现该格式的一小部分的用户,Arrow 项目提供了一些工具,例如 C 数据接口,以帮助与官方 Arrow 库的互操作。
Arrow 库包含许多软件组件,可帮助解决与从远程存储系统中获取数据和将 Arrow 格式的数据通过网络接口移动相关的系统问题。其中一些组件甚至可以在完全不使用列式格式的情况下使用。
最后,除了帮助处理数据访问和 IO 相关问题的软件外,还有一些算法库,用于对 Arrow 数据集执行分析操作或查询。
为什么要为内存中列式数据定义一个标准?
传统上,数据处理引擎的开发人员会创建自定义的数据结构来表示内存中正在处理的数据集。鉴于这些数据结构的“自定义”性质,他们还必须开发序列化接口,以便在这些数据结构与不同的文件格式、网络传输协议、数据库客户端和其他数据传输接口之间进行转换。这样做的最终结果是在开发人员时间和 CPU 周期上造成了巨大的浪费,这些时间和资源都花在了将数据从一种格式序列化到另一种格式上。
Arrow 内存中列式数据格式的基本原理是为几个相互关联的问题提供一个开箱即用的解决方案:
- 一种通用的表格数据表示法,在现代硬件上处理效率极高,同时适用于广泛的用例。我们相信,越来越少的系统会创建自己的数据结构,而会直接使用 Arrow。
- 支持随机访问和流式/扫描式工作负载。
- 标准化的内存格式有助于算法库的重用。当使用自定义的内存数据格式时,通常必须重写通用算法以适应这些自定义数据格式。
- 使用或支持 Arrow 的系统之间可以以极低甚至零成本传输数据。这极大地减少了分析工作负载中的序列化开销,而这通常可能占计算成本的 80-90%。
- Arrow 格式的语言无关设计使得用不同编程语言编写的系统(即使在 JVM 上运行)也能够在没有序列化开销的情况下交换数据集。例如,一个 Java 应用程序可以在源自 JVM 的数据上调用一个 C 或 C++ 算法。
项目状态
Arrow 格式的稳定性如何?在我的应用程序中使用它安全吗?
Arrow 的列式格式和协议被认为是稳定的,我们只打算进行向后兼容的更改,例如增加新的数据类型。它已经被许多应用程序使用,您可以相信兼容性不会被破坏。有关 Arrow 格式版本控制和稳定性的详细信息,请参阅文档。
Arrow 库的稳定性如何?
请参考实现矩阵。
Arrow 数据的 MIME 类型(IANA 媒体类型)
Apache Arrow IPC 协议数据(包括流和文件两种变体)已注册了官方的 IANA 媒体类型(MIME 类型)。
- https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.stream
- https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.file
我们建议使用“.arrow”作为 IPC 文件格式的文件扩展名。
对于 IPC 流格式,建议使用“.arrows”作为文件扩展名。
入门指南
在哪里可以获取 Arrow 库?
许多语言的 Arrow 库都可以通过常用的包管理器获得。具体信息请参见安装页面。
参与贡献
我有一些问题,如何获得帮助?
Arrow 邮件列表是提问的最佳场所。不要害羞——我们随时乐意提供帮助。
我尝试使用 Arrow 但它不工作,你们能修复吗?
希望可以!请提交一份详细的错误报告——这本身就是对项目的宝贵贡献。有关如何提交报告,请参见贡献指南。
Arrow 看起来很棒,如果它能实现 X 功能,我肯定会用。这个功能什么时候能完成?
我们使用 GitHub 作为我们的问题跟踪器。请搜索与您需求相匹配的问题。如果找到了,请随时发表评论并描述您的用例——这将有助于任何接手该任务的人。如果没有找到,请创建一个新的问题。
归根结底,Arrow 是由社区为社区编写的软件。如果您没有看到社区中的其他人正在处理您的问题,那么最好的方法就是自己动手。我们非常愿意帮助您成功地为项目做出贡献。
如何报告安全漏洞?
请发送电子邮件至 private@arrow.apache.org。更多信息请参见安全页面。
与其他项目的关系
Apache Arrow 和 Apache Parquet 有什么区别?
Parquet 不是一种“运行时内存格式”;通常,文件格式几乎总是需要被反序列化到某种内存数据结构中才能进行处理。我们希望 Arrow 成为那种内存数据结构。
Parquet 是一种为实现最大空间效率而设计的存储格式,它使用先进的压缩和编码技术。当希望在存储数GB甚至更多数据时最大限度地减少磁盘占用,Parquet 是理想的选择。这种效率的代价是读取到内存的成本相对较高,因为 Parquet 数据不能直接操作,必须以大块方式进行解码。
相反,Arrow 是一种内存格式,主要用于直接高效地进行计算。Arrow 数据通常不被压缩,而是以适合 CPU 的自然格式进行布局,以便可以全速访问任意位置的数据。(不过,Arrow 确实提供了一组有限的选项来提高空间效率,包括字典编码、行程长度编码和缓冲区压缩。)
因此,Arrow 和 Parquet 相互补充,并且在应用程序中经常一起使用。使用 Parquet 将数据存储在磁盘上,并以 Arrow 格式将其读入内存,将使您能够充分利用您的计算硬件。
那么“Arrow 文件”是什么?
Apache Arrow 定义了一种进程间通信(IPC)机制,用于传输一组 Arrow 列式数组(称为“记录批次”)。它可以使用 Arrow 的“流格式”在进程之间同步使用,或者通过使用 Arrow 的“文件格式”先将数据持久化到存储中来异步使用。
Arrow IPC 机制基于 Arrow 内存格式,因此在磁盘表示和内存表示之间不需要进行转换。因此,对 Arrow IPC 文件进行分析可以使用内存映射,避免任何反序列化成本和额外的拷贝。
在比较 Arrow IPC 文件格式和 Parquet 格式时,需要记住以下几点:
-
Parquet 专为长期存储和归档而设计,这意味着如果您今天编写一个文件,您可以期望任何声称可以“读取 Parquet”的系统在 5 年或 10 年后仍能读取该文件。虽然 Arrow 的磁盘格式是稳定的,并且可以被未来版本的库读取,但它并未优先考虑长期归档存储的要求。
-
读取 Parquet 文件通常需要高效但相对复杂的解码,而读取 Arrow IPC 文件则不涉及任何解码,因为其磁盘表示与内存表示相同。
-
由于 Parquet 使用的列式数据压缩策略,Parquet 文件通常比 Arrow IPC 文件小得多。如果您的磁盘存储或网络速度较慢,即使对于短期存储或缓存,Parquet 也可能是更好的选择。
“Feather”文件格式又是什么?
在 Arrow IPC 文件格式开发之前,Feather v1 格式是一个简化的自定义容器,用于将 Arrow 格式的一个子集写入磁盘。“Feather 第 2 版”现在与 Arrow IPC 文件格式完全相同,为了向后兼容,我们保留了“Feather”的名称和 API。
Arrow 与 Protobuf 有何关系?
Google 的 Protocol Buffers 库(Protobuf)不是一种“运行时内存格式”。与 Parquet 类似,Protobuf 的表示形式不适合直接处理。数据必须被反序列化为像 Arrow 这样的内存表示形式才能进行处理。
例如,Protobuf 中的无符号整数被编码为可变长度整数(varint),每个整数可能占用不同数量的字节,并且最后三位包含字段的传输类型(wire type)。你不能用 CPU 直接对这种格式的数字进行加法运算。
Protobuf 有库可以进行这种反序列化,但它们的目标不是一个通用的内存格式。由 protoc 生成的 C# 代码反序列化的消息,与由 protoc 生成的 Java 代码反序列化的消息,其表示形式是不同的。您需要将数据从一种语言编组(marshal)到另一种语言。
Arrow 避免了这个问题,但代价是空间占用增加。对于在网络上传输某些类型的数据(如单个记录或具有许多可选字段的稀疏数据),Protobuf 可能是更好的选择。就像 Parquet 一样,这意味着 Arrow 和 Protobuf 能够很好地互补。例如,Arrow Flight 使用 gRPC 和 Protobuf 来序列化其命令,而数据则使用二进制的 Arrow IPC 协议进行序列化。
Arrow 与 Flatbuffers 有何关系?
Flatbuffers 是用于二进制数据序列化的底层构建块。它不适用于表示大型、结构化、同构的数据,并且不处于适合数据分析任务的抽象层。
Arrow 是一个直接针对数据分析需求的数据层,它提供了分析所需的全面数据类型集合,内置对“null”值(表示缺失数据)的支持,以及一个不断扩展的 I/O 和计算工具箱。
Arrow 文件格式确实在底层使用 Flatbuffers 来序列化实现 Arrow 二进制 IPC 协议所需的模式(schema)和其他元数据,但 Arrow 数据格式使用其自己的表示形式以实现最佳的访问和计算性能。