Julien Le Dem是 Apache Parquet 的合著者,也是 Apache Arrow 项目的项目管理委员会成员,他在 Data Eng Conf NY 上介绍了面向列的数据处理的未来。
Apache Arrow是在内存中执行列式计算的开源标准,源于Apache Drill的内存列式数据结构。Apache Arrow旨在成为有效地在内存中保存数据并在不同执行引擎之间交换数据的事实上的方式,从而避免序列化。它由13个开源项目的主要开发人员提供支持,这些开源项目主要来自Apache,包括 Calcite 、 Drill 、 Pandas 、 HBase 、 Spark 和 Storm 。
InfoQ采访了Le Dem,以了解Arrow和Parquet的区别以及二者如何能支持更高效的跨执行引擎的计算。Parquet是一个磁盘上的列式存储格式。
Le Dem:从 MonetDB 开始,矢量化执行是最先进的高效查询处理方式。 许多开源查询引擎正在转向这个模型,我们认为有必要标准化内存中的列式表示以提供极高效的互操作性。Parquet提供的列式存储功能,Arrow以内存中的列式处理和互换提供了。
这些标准化努力极大地简化了存储层、查询引擎、 DSL 和 UDF 之间的集成,并通过消除序列化提供了更高效的通信层。通过消除公共的瓶颈,标准化让所有系统进行互操作变得更简单、更便宜、更快速了。然而,通过提供专业的技术进一步提升性能,比如基于压缩向量的操作或者更智能的查询优化器,每个执行引擎还有很大的创新空间。
Le Dem:它们在从磁盘读数据和从内存读数据的取舍上是不同的。当前,谓词下推的实现取决于引擎。虽然还没有开始,但是Apache Arrow最终会提供能跨引擎重用的快速矢量化操作。
Le Dem:Arrow支持字典编码,能提供优秀的压缩效果,让聚合和连接这类操作更快地运行。现在也有一个正在进行的讨论,要使用像 snappy 或者 gzip 这样的通用算法来提供泛化的缓冲压缩。
在这个初始版本中,Arrow还不支持其他压缩技术,如位打包(bit packing)。然而,在使用标准向量进行数据交换的前提下,我们打算让执行引擎能够定义自定义向量。这将允许更高级的技术,例如直接操作压缩向量。 我想到的一个例子是 威斯康星大学 的 BitWeaving 项目。 在将来,标准向量的集合将会扩充。
Arrow的 第一个版本 提供了Pandas库、Arrow和Parquet之间的基于C++的本地集成,让Arrow的Record Batches能作为 Pandas的dataframe 操作并暴露给像Apache Drill这样的基于Hadoop 的SQL引擎(SQL-on-Hadoop engine)。
Le Dem:IPC层仍然处于试验阶段,它是一个真正的零复制(zero-copy)层。当Arrow的Record Batch完成时,它变成不可变的。在此状态下,它可以使用共享内存以只读模式与其他进程共享,而不必担心并发访问。矢量表示独立于其内存地址(不需要绝对指针),并且可以安全地用在共享内存中,每个进程看到的缓冲器地址是不同的。
Le Dem:Arrow支持所有 常见的数据类型 。这是迄今为止相当全面的一份列表了。最近又添加了一些类型,包括SQL的Timestamp和Interval。
查看英文原文: Julien Le Dem on the Future of Column-Oriented Data Processing with Apache Arrow
感谢冬雨对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。