ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache Arrow 技术全景指南:列式内存格式、IPC 协议与多语言实现生态

Apache Arrow 技术全景指南:列式内存格式、IPC 协议与多语言实现生态 数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载Apache Arrow 是一个面向内存分析in-memory analytics的开发平台通过一套标准化的、与语言无关的列式内存格式让大数据系统能够高速地处理和搬运数据。本文以仓库文档站点主入口 docs/source/index.rst 为骨架结合 列式格式规范、版本化规范、实现状态矩阵 与各语言实现文档系统梳理 Arrow 的核心设计、格式演进、多语言实现生态与实际应用方式帮助读者快速建立从格式到实现的完整技术地图。项目定位面向内存分析的计算平台根据 docs/source/index.rst 的定义Apache Arrow 是一个面向内存分析in-memory analytics的开发平台包含一组让大数据系统能够快速处理和移动数据的技术。其核心是一套标准化的、与语言无关的列式内存格式适用于扁平flat与层级hierarchical两类数据并且针对现代硬件上的高效分析操作进行了专门设计。仓库根目录的 README.md 将这一目标概括为 Powering In-Memory Analytics。围绕这一目标项目集中解决与内存分析数据处理相关的系统性问题index.rst 明确列出了三大技术主题零拷贝共享内存与基于 RPC 的数据移动Zero-copy shared memory and RPC-based data movement读写各类文件格式如 CSV、Apache ORC、Apache Parquet内存分析与查询处理In-memory analytics and query processing该文档同时是整套文档站点的导航入口将内容划分为四个层面层面文档入口覆盖内容规范Specificationsdocs/source/format/index.rstArrow 格式及其相关规范与协议开发Developmentdocs/source/developers/index.rst从源码构建、文档构建、贡献与代码评审、持续集成、基准测试、发布流程实现Implementations各语言子文档C/GLib、C、C#、Go、Java、JavaScript、Julia、MATLAB、nanoarrow、Python、R、Ruby、Rust 等示例Examples各语言 CookbookC、Java、Python、R 的实操食谱规范层Arrow 系列格式与协议规范层是理解 Arrow 的起点。按照 docs/source/format/README.md 的说明这些规范文档与 Flatbuffers / Protocol Buffers 协议定义文件配套使用共同提供足以从零构建一个新 Arrow 实现的细节。规范文档位于 docs/source/format/index.rst包含以下主题Versioning格式版本化与稳定性保证Versioning.rstColumnar列式内存格式规范Columnar.rstCanonicalExtensions规范扩展类型如 fixed shape tensor、variable shape tensorOther其他数据布局规范CDataInterface / CStreamInterface / CDeviceDataInterfaceC 语言层面的数据与流接口供各语言零拷贝互操作DissociatedIPC解耦式 IPC 变体Flight / FlightSqlFlight RPC 协议与 SQL 扩展ADBCArrow Database Connectivity 规范Changing格式变更流程Integration跨语言实现的一致性集成测试规范Glossary术语表对应的机器可读协议定义文件位于仓库根目录 format/ 下与规范文档一一对应文件作用format/Schema.fbs内置数据类型定义format/Message.fbsIPC 消息RecordBatch 等定义format/File.fbsArrow 文件随机访问格式定义format/Tensor.fbs、format/SparseTensor.fbs张量与稀疏张量定义format/Flight.protoFlight RPC 协议gRPC/Protobufformat/FlightSql.protoFlight SQL 协议核心列式内存格式Columnar Format列式内存格式是整个 Arrow 生态的基石。根据 Columnar.rst当前规范版本 1.4该格式包含三部分与语言无关的内存数据结构规范、元数据序列化以及序列化与通用数据传输协议。元数据序列化采用 Google Flatbuffers因此实现者需要同时参考 Flatbuffers 协议定义文件即上文的.fbs文件。设计目标与关键特性Columnar 规范明确给出了格式的核心特性这些特性决定了它在现代硬件上的分析性能数据相邻Data adjacency for sequential access同一列的数据在内存中连续存放天然适配顺序扫描scansO(1) 常量时间随机访问任意 slot 可在常量时间内定位SIMD 与向量化友好连续的同构数据可直接交给 SIMD 指令处理无需指针改写即可重定位Relocatable without pointer swizzling这意味着数据可以直接在共享内存中实现真正的零拷贝访问。作为交换列式布局在可变mutation操作上相对更昂贵。规范文档只关注内存表示与序列化细节数据结构变更的协调问题交由各语言实现自行处理。核心术语由于不同项目对同一概念用词不一规范提供了一个小型术语表这也是阅读后续各语言文档的通用语言Array / Vector已知长度的、所有元素同类型的值序列两种叫法在不同实现中混用Slot数组中某个特定数据类型下的单个逻辑值Buffer / 连续内存区域给定长度的连续虚拟地址空间任何字节都可通过一个小于区域长度的指针偏移访问Physical Layout不考虑值语义的底层内存布局例如 32 位有符号整数与 32 位浮点数组的布局相同Data type基于某种物理布局实现的、面向应用的语义值类型如 Decimal128 以 16 字节存储在定长二进制布局中Primitive type没有子类型的类型包括定长位宽、变长二进制和 null 类型Nested type结构依赖一个或多个子类型的类型两个嵌套类型相等当且仅当子类型相等ListU与ListV不同当且仅当 U、V 不同Parent / child arrays描述嵌套类型结构中物理值数组间的关系如ListT父数组以 T 类型数组为子Parametric type需要额外参数才能完整确定语义的类型所有嵌套类型、以及需要单位与时区的 Timestamp。数据类型全览format/Schema.fbs 是标准 Arrow 数据类型的权威定义来源Columnar 规范提供了便于查阅的对照表类型参数 物理布局类型类型参数物理内存布局Null—NullBoolean—定长 PrimitiveInt位宽、有符号性定长 PrimitiveFloating Point精度定长 PrimitiveDecimal位宽、scale、precision定长 PrimitiveDate单位定长 PrimitiveTime位宽、单位定长 PrimitiveTimestamp单位、时区定长 PrimitiveInterval / Duration单位定长 PrimitiveFixed-Size Binary字节宽定长 BinaryBinary / Utf8—32 位偏移变长 BinaryLarge Binary / Large Utf8—64 位偏移变长 BinaryBinary View / Utf8 View—变长 Binary ViewFixed-Size Listvalue type、list size定长 ListListvalue type32 位偏移变长 ListLarge Listvalue type64 位偏移变长 ListList View / Large List Viewvalue type变长 List View偏移 大小StructchildrenStructMapchildren、keys sortednessStruct 的变长 ListUnionchildren、mode、type idsDense 或 Sparse UnionDictionaryindex type、value type、orderednessDictionary EncodedRun-End Encodedrun end type、value typeRun-End Encoded几点需要注意Time 类型的位宽参数在技术上冗余每个单位强制对应一种位宽Union 的 Sparse/Dense 布局由 mode 参数决定Dictionary 的 index type 只能是 8~64 位的整数类型最好有符号Run-End Encoded 的 run end type 只能是 16~64 位有符号整数。此外规范特别指出Arrow 的类型系统不像 Parquet 那样区分物理类型与逻辑类型logical type 一词仅用于强调语义区分同时通过**扩展类型Extension types**机制允许在标准类型之上注解更丰富的应用语义例如在 String 之上定义 JSON 类型。格式版本化与兼容性保证格式的稳定性直接决定了各语言实现能否互操作。根据 Versioning.rst自 1.0.0 起项目使用两个版本号描述每次发布格式版本Format Version与库版本Library Version。每个库版本对应一个格式版本且多个库版本可对应同一格式版本例如库版本 2.0.0 与 3.0.0 可能都跟踪格式版本 1.0.0。1.0.0 之前的大版本可能包含 API 变更自 1.0.0 起库版本遵循语义化版本Semantic Versioning约定。三类兼容性承诺向后兼容Backward Compatibility只要格式的 major 版本不变新版本的库可以读取旧库产生的任何数据与元数据向前兼容Forward Compatibility旧库要么能读取新库生成的数据要么能检测出无法正确读取。格式 minor 版本提升如 1.0.0 → 1.1.0表示新特性加入只要不使用这些新特性如新数据类型向前兼容性即可保持长期稳定Long-Term Stability格式 major 版本变更如 1.0.0 → 2.0.0意味着兼容性保证被打破但项目明确表示预期这种情况不会频繁发生且会谨慎处理以保障生产应用不受损害。1.0.0 之后的格式演进1.0.0 之前不提供前向/后向兼容保证但项目尽力保证新客户端可读取 0.8.0 及之后库版本产出的序列化数据。自 1.0.0 以来格式共经历了4 个 minor 版本、0 个 major 版本每次 minor 版本新增功能不使用新功能时均与 1.0.0 兼容版本 1.1新增 256 位 Decimal 类型Decimal256版本 1.2新增 MonthDayNano 间隔interval类型版本 1.3新增 Run-End Encoded 布局版本 1.4新增变长 Binary View 布局及 BinaryView/Utf8View 类型、ListView/LargeListView 布局与类型以及变长缓冲区variadic buffers支持。这也解释了 status.rst 中所有库当前均遵循 Arrow 格式 1.0.0 或与其兼容的后续 minor 版本的表述。IPC 与零拷贝数据移动零拷贝数据移动是 Arrow 的核心价值之一。仓库 README.md 将Arrow IPC 格式定义为 Arrow 格式及相关元数据的高效序列化方案用于进程间通信IPC与异构环境间通信并提供了两种自描述的二进制线格式Arrow stream format流格式面向流式处理可边序列化边消费Arrow file format文件格式面向随机访问的批量/文件格式。根据 status.rst 的 IPC 特性矩阵主流实现C、Java、Go、JS、C#、Rust、Julia、Swift、nanoarrow在流格式、文件格式、Record Batches、字典Dictionaries、自定义 schema 元数据等项目上普遍达成全覆盖而张量Tensors与稀疏张量Sparse tensors目前仅 C 支持。此外缓冲区压缩Buffer compression与端序转换读取时自动字节交换非本机端序数据在多数实现中可用其中 C 的 LZ4 codec 性能问题由 ARROW-11901 跟踪改进。Flight RPC 与 Flight SQL在 IPC 之上Arrow Flight RPC 协议format/Flight.proto提供了远程服务交换 Arrow 数据的构建块——一个基于 Arrow IPC 格式、语义由应用自定义如存储服务器或数据库的 RPC 框架。根据 status.rstgRPC 传输grpc:、grpctcp:、grpcunix:、grpctls:在 C、Java、Go、C#、Rust 中可用支持全部 RPC 方法、认证处理器、调用超时、调用取消、并发客户端调用、自定义中间件与 RPC 错误码UCX 传输ucx:目前仅 C 支持且只支持 DoExchange、DoGet、DoPut、GetFlightInfo 四个方法并发调用时每个调用独占一条连接不同于 gRPC 的单一连接多路复用通常吞吐更高但客户端与服务端资源消耗更大。Flight SQLformat/FlightSql.proto在 status.rst 中被明确标注为仍处于实验阶段其特性覆盖指客户端/服务端库本身具体数据库对协议各特性的支持由各实现决定。当前 C 与 Java 覆盖度最高含 BeginTransaction、PreparedStatement、GetSqlInfo、StatementSubstraitPlan 等Go、C#、Rust 覆盖常用查询与元数据接口。多语言实现生态index.rst 的 Implementations 部分给出了完整的官方实现清单各实现均可在本仓库中找到对应源码目录与文档入口语言仓库目录文档入口C/GLibc_glib/docs/source/c_glib/Ccpp/含 cpp/CMakeLists.txtdocs/source/cpp/index.rstC#csharp/csharp/README.mdGogo/Go 模块文档arrow 与 parquet 子模块Javajava/docs/source/java/index.rstJavaScriptjs/docs/source/js/Julia外部仓库独立站点MATLABmatlab/matlab/README.mdnanoarrow外部仓库独立站点PythonPyArrowpython/docs/source/python/index.rstRr/docs/source/r/RubyRed Arrowruby/ruby/README.mdRust外部仓库arrow-rsRust 文档几个值得注意的实现特点均有仓库文档佐证PythonPyArrow基于 C 实现构建的绑定层与 NumPy、pandas 及 Python 内建对象拥有一等集成这也是 PyArrow 成为数据科学生态事实标准的重要原因python/index.rstJava提供完整的独立实现涵盖 memory、vector、table、IPC、algorithm、Flight、Flight SQL、Dataset、Substrait、C Data Interface、JDBC 等模块java/index.rstC功能最全面的参考实现文档分为 Getting started、User Guide、Examples 与 API Reference 四大部分cpp/index.rst按 status.rst 的说明Python、R、Ruby 与 C/GLib 库均跟随 C Arrow 库的能力集因此这些绑定层的功能覆盖可参照 C 的状态矩阵。实现状态矩阵功能覆盖一目了然status.rst 是判断某个库是否支持某个特性的权威依据覆盖以下维度数据类型基础类型Null、Boolean、Int8/16/32/64、UInt、Float16/32/64、Decimal128/256、Date32/64、Time32/64、Timestamp、Duration、Interval、各类 Binary/Utf8 及 View 变体与嵌套类型Fixed-Size List、List、Large List、List View、Struct、Map、Dense/Sparse Union在 C、Java、Go、JS、C#、Rust、Julia、Swift、nanoarrow 中普遍 ✓较新的 View 系列与 Run-End Encoded 目前仅 C 与 Go 等少数实现支持IPC 格式流格式、文件格式、Record Batches、字典、缓冲区压缩、端序转换、自定义 schema 元数据等Flight RPCgRPC 与 UCX 两种传输的详细特性矩阵Flight SQL20 余项接口在各实现中的覆盖情况C Data / C Stream InterfaceSchema/Array 的导出与导入Python、R、Rust、Go、Java、C/GLib、Ruby、C#、nanoarrow 均支持第三方数据格式详见下文。矩阵中特别标注的注意事项包括Java 不支持 Float16 的 cast 转换C# 的 Float16 仅在 .NET 6 可用C/Rust 的字典类型不支持嵌套字典Java 的 ORC/Parquet 读取通过 JNI 绑定到 C 实现完成。第三方文件格式读写能力index.rst 将读取和写入文件格式如 CSV、Apache ORC、Apache Parquet列为项目的三大主题之一status.rst 的Third-Party Data Formats矩阵给出了各实现的读写能力R 读、W 写格式CJavaGoRustJuliaAvro—RR——CSVR/WRR/WR/WR/WORCR/WR———ParquetR/WRR/WR/W—其中 Java 对 CSV 与 Parquet 的读取通过 JNI 绑定到 Arrow C Datasets 实现由org.apache.arrow:arrow-dataset提供ORC 读取则通过org.apache.arrow.orc:arrow-orcJNI 绑定。此外C 还提供 CSV/JSON/ORC/Parquet/Feather 等格式的读写器参见 python/README.md 对 pyarrow 各子模块的说明。开发、构建与贡献对于希望参与开发或从源码构建的用户docs/source/developers/index.rst 是入口文档主要内容包括各语言开发指南Cdocs/source/cpp/ 下的 development 与 building 文档、Javadocs/source/java/index.rst、Pythondocs/source/python/ 的 python-development 章节、R、Ruby贡献指南Contributing to Apache Arrow所有参与均受 ASF 行为准则约束从加入邮件列表、报告 bug、改进文档到新贡献者指南、贡献概览与代码评审流程持续集成需要覆盖不同的包管理器、编译器、软件库版本、操作系统等组合参见 ci/ 下的 docker 与 scripts 脚本基准测试如何使用基准测试套件发布流程与发布验证详尽的发布步骤与验证流程文档。各实现的构建入口均可从仓库顶层目录找到例如 C 的 cpp/CMakeLists.txt 与 CMake 预设cpp/CMakePresets.json、C/GLib 的 c_glib/README.md、Python 的 python/README.md 与 python/setup.py。仓库中还有完整的集成测试体系如 format/Integration.rst 定义的跨语言二进制兼容性验证例如从 Java 发送数据到 C。示例与 Cookbookindex.rst 的 Examples 部分提供了面向实操的示例资源C、Java、Python、R 四种语言的 Cookbook 合集覆盖各种常见任务如读取 Parquet、列式计算、与 pandas 互操作等。仓库内也包含可直接运行的示例代码例如 cpp/examples/C 示例含构建说明、c_glib/example/C/GLib 的 C 与 Vala 示例、python/examples/以及 r/vignettes/ 中的 R 教程文档。这些示例与各语言文档配合可以快速上手从内存数组构建、IPC 传输到文件读写的完整链路。结语从文档入口到技术全景docs/source/index.rst虽然只是一页索引但它精准地刻画了 Apache Arrow 的定位以标准化的列式内存格式为内核以 IPC/Flight 实现零拷贝数据移动以覆盖十余种语言的实现矩阵兑现一处格式、处处互通的承诺。顺着本文梳理的规范层format/index.rst、状态层status.rst、实现层各语言文档与开发层developers/index.rst四个维度读者可以在仓库内快速定位到任何所需的技术细节无论是阅读格式规范、核对特性支持还是动手构建与贡献代码。赞分享数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载相关推荐Apache Arrow 项目全解析加速内存分析的列式格式、IPC 协议与多语言参考实现Apache Arrow 项目全解析加速内存分析的列式格式、IPC 协议与多语言参考实现 Apache Arrow 是一个面向内存分析in memory a数据工程数据分析大数据Apache Arrow 技术全景指南列式内存格式、多语言实现与官方文档导航Apache Arrow 技术全景指南列式内存格式、多语言实现与官方文档导航 本指南以 Apache Arrow 官方文档入口页 docs/source/i数据工程数据分析大数据Apache Arrow Java 模块全景指南列式内存、IPC 与 Flight 的多层实现Apache Arrow Java 模块全景指南列式内存、IPC 与 Flight 的多层实现 Apache Arrow 是一个面向跨语言数据交换与内存计算的数据工程大数据序列化数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表