Apache Arrow 简介

导航至

了解 Apache Arrow 是什么、它的工作原理,以及一些公司如何将其用作其架构中的关键组件。

在过去的几十年里,利用大型数据集需要企业执行越来越复杂的分析。查询性能、分析和数据存储的进步很大程度上是由于对内存的更大访问。需求、制造工艺的改进和技术进步都促成了更便宜的内存。较低的内存成本刺激了支持 OLAP(在线分析处理)和数据仓库系统的内存查询处理技术的创建。OLAP 是任何对大量数据执行快速多维分析的软件。

Apache Arrow 是这些技术的示例项目之一。在本文中,您将了解 Arrow 是什么、它的优势以及一些公司和项目如何使用 Arrow。

什么是 Apache Arrow?

Apache Arrow 是一个框架,用于定义每个处理引擎都可以使用的内存列式数据。它旨在成为与语言无关的列式内存表示标准,以促进互操作性。来自 Impala、Spark 和 Calcite 等公司的几位开源领导者开发了它。联合创始人之一是 Pandas 的创建者 Wes McKinney。他希望使 Pandas 与数据处理系统互操作,而 Arrow 解决了这个问题。

Apache Arrow 技术分解

Apache Arrow 实现了广泛采用,因为它提供了高效的列式内存交换。它提供零拷贝读取(CPU 不会将数据从一个内存区域复制到第二个内存区域),这减少了内存需求和 CPU 周期。

由于 Arrow 具有基于列的格式,因此处理和操作数据也更快(稍后部分将详细介绍)。它的构建者为现代 CPU 和 GPU 设计了 Arrow,以便它可以并行处理数据,并利用单指令/多数据 (SIMD)、向量化处理和向量化查询等技术。

使用 Apache Arrow 的公司和项目

Apache Arrow 为各种数据分析和存储解决方案项目提供支持,包括

  • Apache Spark 是一个大规模并行处理数据引擎,它使用 Arrow 将 Pandas DataFrames 转换为 Spark DataFrames。这使数据科学家能够将基于小数据集开发的 POC 模型移植到大型数据集。

  • Apache Parquet 是一种极其高效的列式存储格式。Parquet 使用 Arrow 进行向量化读取。向量化读取器通过批量处理列式格式的多个行,使列式存储更加高效。

  • InfluxDB 是一个时间序列数据平台。新的存储引擎使用 Arrow 支持近乎无限基数用例、使用多种查询语言(包括 Flux、InfluxQL、SQL 和更多即将推出)进行查询,并提供与 BI 和数据分析工具的互操作性。

  • Pandas 是一个基于 Python 构建的数据分析工具包。Pandas 使用 Arrow 为 Parquet 提供读写支持。

Apache Arrow 和 InfluxDB

InfluxData 最近宣布推出了基于 Apache 生态系统构建的新存储引擎。具体来说,开发人员使用 Rust 在 Apache Arrow、Apache DataFusion 和 Apache Parquet 之上编写了新引擎。Apache Arrow 通过提供高效的列式数据交换,帮助 InfluxDB 实现近乎无限的基数或维度用例。想象一下,我们将以下数据写入 InfluxDB

名称:measurement1
field1 field2 tag1 tag2 tag3 时间
1i tagvalue1 时间戳1
2i tagvalue2 时间戳2
3i tagvalue3 时间戳3
4i tagvalue1 tagvalue3 tagvalue4 时间戳4
1i 时间戳5

但是,引擎以如下列式格式存储数据

1i 2i 3i 4i 1i
tagvalue1 tagvalue2 tagvalue1
tagvalue3 tagvalue3
tagvalue4
时间戳1 时间戳2 时间戳3 时间戳4 时间戳5

或者,换句话说,它像这样存储数据

1i, 2i, 3i, 4i, 1i; 
null, null, null, true, null; 
tagvalue1, tagvalue2, null, tagvalue1, null; 
null, null, null, tagvalue3, tagvalue3, null; 
null, null, null, tagvalue4, null; 
timestamp1, timestamp2, timestamp3, timestamp4, timestamp5.

以列式格式存储数据允许数据库将类似数据分组在一起以实现廉价压缩。具体来说,“Apache Arrow 定义了一种进程间通信 (IPC) 机制,用于传输 Arrow 列式数组(称为“记录批次”)的集合,如本 FAQ 中所述。此外,时间序列数据是独一无二的,因为它通常有两个因变量。您的时间序列的值取决于时间,并且值与它们前面的值具有一定的相关性。时间序列的这个属性意味着 InfluxDB 可以通过字典编码更大程度地利用记录批次压缩。字典编码允许 InfluxDB 消除重复值的存储,这些值经常存在于时间序列数据中。它还支持使用 SIMD 指令进行向量化查询指令。

对 Apache Arrow 的贡献以及对开源的承诺

除了 InfluxDB Cloud 的免费层之外,InfluxData 还根据宽松的 MIT 许可证提供 InfluxDB 的 OSS 版本。开源产品为社区提供了基于代码构建自己的解决方案的自由以及发展代码的能力,这为产生实际影响创造了机会。当聪明的人可以使用好的工具时,他们就会创造出有影响力的解决方案。然而,当开发人员不仅提供开源代码,而且还为流行的项目做出贡献时,开源的真正力量就变得显而易见了。跨组织协作产生了一些最流行的开源项目,如 TensorFlow、Kubernetes、Ansible 或 Flutter 等。InfluxDB 的存储工程师 为 Apache Arrow 贡献了大量工作

InfluxDB IOx 团队管理 https://crates.io/crates/arrowhttps://crates.io/crates/parquet 版本的每周发布。他们还帮助撰写和支持 DataFusion 博客文章,如:Apache Arrow DataFusion 项目更新2022 年 6 月 Rust Apache Arrow 和 Parquet 16.0.0 亮点

对 Arrow 的其他贡献包括

结论

要利用新的 InfluxDB 存储引擎的所有进步,请在此处注册。

如果您想联系 InfluxDB 引擎开发人员,请加入 InfluxData 社区 Slack 并查找 #influxdb_iox 频道。

查看以下关于新存储引擎的内容以了解更多信息

我希望这篇博文能激发您探索 InfluxDB Cloud。如果您需要任何帮助,请使用我们的社区网站Slack 频道与我们联系。我很乐意了解您正在尝试实现的目标以及您希望 InfluxDB 中的任务系统具备哪些功能。

最后,如果您正在 InfluxDB 之上开发一个很酷的物联网应用程序,我们很乐意听到,所以请务必在社交媒体上使用 #InfluxDB 分享它!

欢迎随时在我们的社区 slack 频道中直接与我联系,分享您的想法、疑虑或问题。我很乐意获得您的反馈并帮助您解决遇到的任何问题!或者分享您的故事并获得一件免费的 InfluxDB 连帽衫。