Apache Arrow 如何改变大数据生态系统
作者:Charles Mahler / 用例
2023年1月5日
导航至
本文最初发表于 The New Stack,并经许可在此转载。
Arrow 使分析工作负载在现代 CPU 和 GPU 硬件上更高效,从而使处理大型数据集更轻松且成本更低。
处理 大数据 的最大挑战之一是在数据处理管道中,在不同工具和系统之间移动数据所涉及的性能开销。
不同的编程语言、文件格式和网络协议都以不同的方式在内存中表示相同的数据。在数据管道的每个步骤中,将相同的数据序列化和反序列化为不同的表示形式的过程,使得处理大量数据变得更慢,并且在硬件方面成本更高。
解决这个问题的方法是创建一种可以被视为数据通用语的东西,工具和 编程语言 可以使用它作为高效传输和操作大量数据的通用标准。Apache Arrow 是这个概念的一个被提出的实现,并且已经开始被广泛采用。
什么是 Apache Arrow?
Apache Arrow 是一个开源项目,旨在为平面和分层数据提供标准化的 列式内存格式。Arrow 使分析工作负载在现代 CPU 和 GPU 硬件上更高效,从而使处理大型数据集更轻松且成本更低。
Apache Arrow 于 2016 年上线,随着时间的推移,其范围和功能不断扩大,许多以前独立的项目被集成到核心 Arrow 项目中,例如 DataFusion 和 Plasma。
Apache Arrow 的总体目标可以概括为,通过为处理分析数据的不同系统创建通用接口,力求在 OLAP 工作负载方面实现 ODBC/JDBC 在 OLTP 工作负载方面所做的事情。
Apache Arrow 的优势
性能
采用 Arrow 的主要优势是性能。使用 Arrow,当在不同的工具和语言之间移动数据时,您不再需要序列化和反序列化数据,因为它们都可以使用 Arrow 格式。当您需要多台服务器来处理数据时,这在规模上尤其有用。
这是一个来自 Ray 的性能提升示例,Ray 是一个用于管理分布式计算的 Python 框架
将数据转换为 Arrow 格式不仅比使用 Python 的替代方案(如 Pickle)更快,而且更大的性能提升来自于反序列化,其速度要快几个数量级。
由于 Arrow 的列式格式,处理和操作数据也更快,因为它专为现代 CPU 和 GPU 设计,因此可以并行处理数据,并利用 SIMD(单指令多数据)等技术进行矢量化处理。
Arrow 还提供零拷贝读取,因此在您希望以不同方式转换和操作相同底层数据的情况下,可以减少内存需求。
通过 Parquet 进行批量数据导入和导出
Arrow 与 Apache Parquet 完美集成,Apache Parquet 是另一种专注于磁盘持久化的列式数据格式。Arrow 和 Parquet 的结合使管理从 RAM 到磁盘的数据生命周期和移动变得更加容易和高效。
生态系统
Apache Arrow 的另一个优势是生态系统。随着时间的推移,越来越多的功能和特性被添加进来,性能也在不断提高。正如您将在接下来的章节中看到的那样,在许多情况下,公司都在向 Apache Arrow 捐赠整个项目,并为项目本身做出重大贡献。
Apache Arrow 几乎使所有公司受益,因为它使系统之间的数据移动更加容易。这意味着通过向项目添加 Arrow 支持,开发人员也更容易迁移或采用该技术。
Apache Arrow 的特性
现在,让我们来看看 Apache Arrow 项目的一些关键特性和不同组件。
Arrow 列式格式
Arrow 列式格式是项目的核心,定义了数据在内存中应如何结构的实际规范。从性能角度来看,此格式提供的关键特性是
- 数据能够被顺序读取。
- 恒定时间随机访问。
- SIMD 和矢量处理支持。
- 零拷贝读取。
有多种语言的客户端库,使入门 Arrow 变得容易。
Arrow Flight
Arrow Flight 是一个添加到项目中的 RPC(远程过程调用)框架,允许在网络上轻松传输大量数据,而无需序列化和反序列化的开销。Arrow 提供的压缩还意味着与不太优化的协议相比,消耗的带宽更少。许多项目使用 Arrow Flight 来为分析和数据科学工作负载启用分布式计算。
Arrow Flight SQL
Arrow Flight SQL 是 Arrow Flight 的扩展,用于直接与 SQL 数据库交互。虽然它仍被认为是 实验性的,但功能正在快速添加。最近,一个 JDBC 驱动程序 被添加到项目中,这意味着任何支持 JDBC(Java 数据库连接)或 ODBC(Microsoft 开放数据库连接)的数据库现在都可以通过 Flight SQL 与 Arrow 数据通信。
Arrow DataFusion
DataFusion 是一个查询执行框架,于 2019 年捐赠给 Apache Arrow。DataFusion 包括一个查询优化器和执行引擎,支持 SQL 和 DataFrame API。它通常用于创建数据管道、ETL 流程和数据库。
使用 Apache Arrow 的项目
许多项目正在添加与 Arrow 的集成,以使其工具更容易被采用,或将 Arrow 的组件直接嵌入到他们的项目中,以避免重复工作。
- InfluxDB IOx — InfluxDB 的新型列式存储引擎 IOx 使用 Arrow 格式来表示数据,并将数据移入和移出 Parquet。它还使用 DataFusion 为 InfluxDB 添加 SQL 支持。
- Apache Parquet — Parquet 是一种用于存储 列式数据 的文件格式,被许多项目用于持久化。Parquet 支持 与 Arrow 进行矢量化读写。
- Dask — Dask 是一个并行计算框架,可以轻松地水平扩展 Python 代码。Dask 使用 Arrow 访问 Parquet 文件。
- Ray — Ray 是一个框架,允许数据科学家使用统一的工具处理数据、训练机器学习模型,然后在生产环境中服务这些模型。Ray 依赖 Apache Arrow 在组件之间移动数据,且开销最小。
- Pandas — Pandas 是 Python 生态系统中最流行的数据分析工具之一。Pandas 能够通过在后台使用 Apache Arrow 读取存储在 Parquet 文件中的数据。
- TurboDC — TurboDC 是一个基于 ODBC 接口的工具,允许数据科学家通过 Python 高效地访问存储在关系数据库中的数据。Arrow 通过允许数据以批处理而不是单个记录的方式传输,使效率更高。
结论
在许多不同的软件开发领域,一个大的趋势是通过提高互操作性来消除锁定效应。在可观测性和监控领域,我们可以通过 OpenTelemetry 等项目看到这一点,在大数据生态系统中,我们可以通过 Apache Arrow 等项目看到类似的努力。
利用 Apache Arrow 的开发人员不仅可以通过避免重复造轮子来节省时间,还将获得访问也使用 Arrow 的整个工具生态系统的权限,这可以使新用户更容易采用。