Apache Arrow:跨平台的内存数据交换格式

过往记忆大数据 过往记忆大数据
Apache Arrow是Apache基金会下一个全新的开源项目,同时也是顶级项目。它的目的是作为一个跨平台的数据层来加快大数据分析项目的运行速度。它为列式内存存储的处理和交互提供了规范。目前来自 Calcite, Cassandra, Drill, Hadoop, HBase, Ibis, Impala, Kudu, Pandas, Parquet, Phoenix, Spark, and Storm 等13个社区的开发者们致力于将它制定为大数据系统项目的事实性标准。

用户在应用大数据分析时除了将Hadoop等大数据平台作为一个经济的存储和批处理平台之外也很看重分析系统的扩展性和性能。过去几年开源社区已经发布了很多工具来完善大数据分析的生态系统,这些工具涵盖了数据分析的各个层面,比如列式存储格式(Parquet/ORC)、内存计算层(Drill、Spark、Impala和Storm)以及强大的API接口(Python和R语言)。Arrow则是最新加入的一员,它提供了一种跨平台跨应用的内存数据交换格式。比如在最近发布的 Spark 3.0 中就使用 Arrow 将 SparkR 的性能提升了最少 40%,参见 Apache Spark 3.0.0 正式版终于发布了,重要特性全面解析。

提高大数据分析性能的一个重要手段是对列式数据的设计和处理。列式数据处理借助向量计算和SIMD使我们可以充分挖掘硬件的潜力。Apache Drill这一大数据查询引擎无论是在硬盘还是在内存中数据都是以列的方式存在的,而Arrow就是由Drill中Value Vector这一数据格式发展而来。除了列式数据,Apache Arrow也支持关系型和动态数据集,这使它成了处理物联网等数据时的理想格式选择。

Apache Arrow为大数据生态系统带来了可能性是无穷的。有Apache Arrow做为今后的标准数据交换格式,各个数据分析的系统和应用之间的交互性可以说是上了一个新的台阶。过去大部分的CPU周期都花在了数据的序列化和反序列化上,现在我们则能够实现不同系统之间数据的无缝共享。这意味着用户在将不同的系统结合使用时再也不用为数据格式多花心思了。下图是列式存储格式和行式存储格式之间的区别:

使用Apache Arrow前后优势对比

在 Apache Arrow 诞生之前,如果不同系统之间需要交互数据的话,就得如下处理

这样产生的问题如下:

  • 每个系统都有自己内部的内存格式;
  • 70-80%的CPU浪费在序列化和反序列化过程;
  • 类似功能在多个项目中实现,没有一个标准。

在项目中使用 Apache Arrow 进行系统数据交互之后,架构变成以下形式了:

可以看出:

  • 所有系统都使用同一个内存格式;
  • 避免了系统间通信的开销;
  • 项目间可以共享功能(比如Parquet-to-Arrow reader)

Apache Arrow主要有以下几点的优势:

  • 列式的内存布局可以使得随机访问的速度达到O(1)。这种内存布局在处理分析流和允许SIMD(Single input multiple data) 优化的现代处理器上非常的高效;开发者们可以开发出非常高效的算法来处理Apache Arrow的数据结构;
  • 它使得系统之间数据的交互变得很高效,而且避免了数据的序列化和反序列化的消耗;
  • 支持复杂的数据类型。
    Apache Arrow之所以可以使得数据的随机访问达到O(1)。这是因为Apache Arrow对分析结构化的数据进行了优化,如下的数据:
people = [ {   name: ‘mary’, age: 30,   places_lived: [     {city: ‘Akron’, state: ‘OH’},     {city: ‘Bath’, state: OH’}   ] }, {   name: ‘mark’, age: 33,   places_lived: [     {city: ‘Lodi’, state: ‘OH’},     {city: ‘Ada’, state: ‘OH’},     {city: ‘Akron’, state: ‘OH}   ] }]

现在假如我们需要访问people.places_lived.city的值。在Arrow中,数组值的访问看起来如下:


Arrow记录了places_lived字段和city字段的偏移量,我们可以通过这个偏移量得到字段的值。因为Arrow通过记录offset,使得数据的访问非常的高效。

Apache Arrow项目官网:http://arrow.apache.org/
Apache Arrow项目Github:https://github.com/apache/arrow

©著作权归作者所有:来自51CTO博客作者mob604756f47778的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 敖丙跟你聊聊MySQL安全的那些事
  2. 阿里面试:说说一致性读实现原理?
  3. 国内最好的数据丢失防护服务-Ping32
  4. Linux运维入门教程06-02 (系统的初始化和服务)
  5. 马铁大神的 Apache Spark 十年回顾
  6. Spark 背后的商业公司收购的 Redash 是个啥?
  7. mysql学习笔记-1 【路飞学城6天学会数据库课程】
  8. MySQL学习笔记-2 【路飞学城6天学会数据库课程】
  9. 全方位解读数砖的 Delta Engine

随机推荐

  1. java小白到架构师技术图谱(整理全网,持续更
  2. 教程资源汇总(已更新)
  3. 一次StackOverflowError排查,原因竟然和Du
  4. 你的程序出现了bug?这几款JVM工具也许可以
  5. React Async Rendering
  6. React 16.3新API
  7. 第2年
  8. 我们到底该如何学习数据结构与算法
  9. 为你Springboot项目自定义一个通用的异常
  10. 看源码,我为什么推荐IDEA?