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(一个用于管理分布式计算的 Python 框架)的性能提升示例
将数据转换为 Arrow 格式比使用 Python 中的 Pickle 等替代方案更快,但在反序列化方面,性能提升更为显著,速度快了好几个数量级。
由于 Arrow 的基于列的格式,数据处理和操作也更快,因为它是为现代 CPU 和 GPU 设计的,这样数据就可以并行处理并利用 SIMD(单指令,多数据)等向量处理。
Arrow 还提供了零拷贝读取,因此在需要以不同方式转换和操作相同基础数据的情况下,可以降低内存需求。
通过 Parquet 批量数据导入/导出
Arrow 与 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 的整个工具生态系统,这可以使新用户的采用更加容易。