apache arrow

apache arrow

简介

  • Apache Arrow 是一种基于内存的列式数据格式;

  • 为了解决系统到系统之间的数据传输问题,

  • 2016 年 2 月 Arrow 被提升为 Apache 的顶级项目。

  • 和protobuf相比,protobuf主要是序列化structured data,有很多的键值对和非常深的nested structure。arrow序列化的对象主要还是表格状数据。

主要技术

  • 适配器模式

image-20190513185116005

  • 列式存储

    image-20190513185147232

  • SIMD

    即单指令流多数据流(SingleInstruction Multiple Data),是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。在微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元。

对于 Apache Arrow 的期望:

  • 列式存储:大数据系统几乎都是列式存储的,类似于 Apache Parquet 这样的列式数据存储技术自从诞生起就是大家的期望。
  • 内存式:SAP HANA 是第一个利用内存加速分析流程的组件,随着 Apache Spark 的出现,进一步提升了利用内存加速流程的技术可能性落地。
  • 复杂数据和动态模式:当我们通过继承和内部数据结构呈现数据的时候,一开始有点麻烦,后来就有了 JSON 和基于文档的数据库。

Arrow 的列式存储有着 O(1) 的随机访问速度,并且可以进行高效的 Cache,同时还允许 SIMD 指令的优化。由于很多大数据系统都是在 JVM 上运行的,Arrow 对于 Python 和 R 的社区来说显得格外重要。

Apache Arrow 是基于 Apache Drill 中的 Value Vector 来实现的,而使用 Value Vector 可以减少运算时重复访问数据带来的成本。

内存表示

arrow在内存中表示数据的最基本单元是array,它代表了一连串长度已知、类型相同的数据。而多个长度相同、类型相同或者不同的array就可以用来表示结果集(或者一部分的结果集)。举一个简单的例子:一个如下图所示的结果集(或者table)

1
2
3
4
5
6
7
+------+------+                                 
|   C1 |   C2 |            [
|------+------|              DoubleArray: [ 1.11, 2.22, 3.33],
| 1.11 |  foo |     ->       StringArray: [ foo, bar, NULL]
| 2.22 |  bar |            ]
| 3.33 | NULL |   
+------+------+

就可以表示成一个大小为2的有序集合,集合中的array(DoubleArray 和 StringArray)长度为3。arrow限制了array的最大长度,当结果集(或者表)的大小超过了array的最大长度,就需要把结果集水平切分成多个有序集合。

Arrow Flight

近段时间Arrow最大的变化就是添加了Flight,一个通用C/S架构的高性能数据传输框架。Flight基于gRPC开发,从最开始重点就是优化Arrow格式数据。

Flight的具体细节请看官方文档。这里只介绍它的优势:

  • 无序列化/反序列化:Flight会直接将内存中的Arrow发送,不进行任何序列化/反序列化操作
  • 批处理:Flight对record batch的操作无需访问具体的列、记录或者元素
  • 高并发:Flight的吞吐量只收到客户端和服务端的吞吐量以及网络的限制
  • 网络利用率高:Flight使用基于HTTP/2的gRPC,不仅是快

官方给出的数据是Flight的传输大约是标准ODBC的20-50倍。

参考

  1. 聊聊 Apache Arrow
  2. Apache Arrow简介
  3. Apache Arrow - 大数据在数据湖后的下一个风向标 - 云+社区 - 腾讯云
  4. Apache Arrow 内存数据-阿里云开发者社区
  5. http://www.liuhaihua.cn/archives/698599.html
updatedupdated2024-05-152024-05-15