Velox 简介:数据平台统一执行引擎


Meta 撰写了有关 Velox 的文章,这是其用于数据工作负载的开源统一执行引擎。该项目是一个令人兴奋的项目

  1. 它正在远离默认的基于 JVM 的执行引擎,带有 Spark 和 Presto,但提供了完整的查询兼容性。
  2. 数据帧库可以将执行计划表示为 Velox 计划,这为数据帧和 SQL 工作负载提供了统一执行引擎的可能性。 

Meta 创建并开源了Velox。这是一个新颖的、最先进的统一执行引擎,旨在加速数据管理系统并简化其开发。Velox 统一了数据计算引擎的常见数据密集型组件,同时仍可扩展和适应不同的计算引擎。它将以前仅在单个引擎中实现的优化民主化,提供了一个可以实现一致语义的框架。这减少了工作重复,提高了可重用性,并提高了整体效率和一致性。

Velox 正在积极开发中,但它已经处于与 Meta 的十几个数据系统集成的不同阶段,包括 Presto、Spark 和 PyTorch(后者通过一个名为 TorchArrow 的数据预处理库)以及其他内部流处理平台、事务引擎、数据摄取系统和基础设施、用于特征工程的 ML 系统等。 
Velox 开源项目自首次上传到 GitHub以来,已经吸引了超过 150 名代码贡献者,其中包括 Ahana、Intel 和 Voltron Data 等关键合作者,以及各种学术机构。

Velox 概述
虽然数据计算引擎一开始可能看起来不同,但它们都由一组相似的逻辑组件组成:语言前端、中间表示 (IR)、优化器、执行运行时和执行引擎。Velox 提供了实现执行引擎所需的构建块,包括在单个主机内执行的所有数据密集型操作,例如表达式评估、聚合、排序、连接等 - 通常也称为数据平面。因此,Velox 期望一个优化的计划作为输入,并使用本地主机中的可用资源有效地执行它。

Velox 利用了许多运行时优化,例如过滤器和联合重新排序、数组和基于哈希的聚合和连接的键规范化、动态过滤器下推和自适应列预取。

Velox 提供的主要组件有:

  • 类型:一种通用类型系统,允许开发人员表示标量、复杂和嵌套数据类型,包括结构、映射、数组、函数 (lambda)、小数、张量等。
  • Vector:与 Apache Arrow 兼容的列式内存布局模块,支持多种编码,例如平面、字典、常量、序列/RLE 和参考框架,此外还有惰性实现模式和对无序结果缓冲区填充的支持.
  • 表达式评估:基于向量编码数据构建的最先进的向量化表达式评估引擎,利用常见子表达式消除、常量折叠、高效空值传播、编码感知评估、字典剥离和记忆等技术。
  • 函数:开发人员可以使用 API 来构建自定义函数,为标量函数提供简单(逐行)和矢量化(逐批)接口,并为聚合函数提供 API。 
    • 与流行的 PrestoSQL 方言兼容的函数包 也作为库的一部分提供。
  • 运算符:常见 SQL 运算符的实现,例如 TableScan、Project、Filter、Aggregation、Exchange/Merge、OrderBy、TopN、HashJoin、MergeJoin、Unnest 等。
  • I/O:一组 API,允许 Velox 集成到其他引擎和运行时的上下文中,例如:
    • 连接器:使开发人员能够为 TableScan 和 TableWrite 运算符专门化数据源和接收器。
    • DWIO:一个可扩展的接口,提供对 Parquet、ORC 和 DWRF 等流行文件格式的编码/解码的支持。
    • 存储适配器:基于字节的可扩展接口,允许 Velox 连接到存储系统,例如Tectonic、S3、HDFS 等。 
    • 序列化器:针对网络通信的序列化接口,可以实现不同的有线协议,支持PrestoPage和 Spark 的 UnsafeRow 格式。
  • 资源管理:用于处理计算资源的原语集合,例如 CPU 和内存管理、溢出以及内存和 SSD 缓存。

Velox的主要集成和实验结果
除了提高效率之外,Velox 还通过跨不同数据计算引擎统一执行引擎来提供价值。三个最流行的集成是 Presto、Spark 和 TorchArrow/PyTorch。

1、Presto — Prestissimo 
Velox 作为Prestissimo项目的一部分被集成到 Presto 中,其中 Presto Java 工作人员被基于 Velox 的 C++ 进程所取代。该项目最初由 Meta 于 2020 年创建,目前正在与 Ahana 以及其他开源贡献者合作继续开发。
Prestissimo 提供 Presto 的 HTTP REST 接口的 C++ 实现,包括工作人员到工作人员的交换序列化协议、协调员到工作人员的编排和状态报告端点,从而为 Presto 工作人员提供了 C++ 替代品。主要查询工作流程包括从 Java 协调器接收 Presto 计划片段,将其转换为 Velox 查询计划,并将其交给 Velox 执行。

2、Spark—Gluten 
Velox 也被集成到 Spark 中,作为英特尔创建的Gluten 项目的一部分。Gluten 允许在执行 Spark SQL 查询时在 Spark 环境中使用 C++ 执行引擎(例如 Velox)。Gluten 通过创建基于 Apache Arrow 数据格式和 Substrait 查询计划的 JNI API 将 Spark JVM 和执行引擎解耦,因此只需与 Gluten 的 JNI API 集成,就可以在 Spark 中使用 Velox。
Gluten 的代码库可在 GitHub 上找到。 

3、TorchArrow
TorchArrow是一个数据框 Python 库,用于深度学习中的数据预处理,是 PyTorch 项目的一部分。TorchArrow 在内部将数据帧表示形式转换为 Velox 计划,并将其委托给 Velox 执行。除了融合 ML 数据预处理库原本分散的空间之外,这种集成还允许 Meta 整合分析引擎和 ML 基础设施之间的执行引擎代码。它通过公开相同的函数/UDF 集并确保跨引擎的一致行为,为 ML 最终用户提供更一致的体验,这些最终用户通常需要与不同的计算引擎交互以完成特定任务。
TorchArrow 最近在 GitHub 上以beta 模式发布。

总结
Velox 证明,通过将数据计算系统的执行引擎整合到一个统一的库中,可以使数据计算系统更具适应性。
 Velox 的统一和模块化特性有可能造福于利用数据管理系统的行业,尤其​​是那些开发数据管理系统的行业。它将使我们能够与硬件供应商合作,并随着硬件的进步主动调整我们的统一软件堆栈。随着数据工作负载的发展,重用统一且高效的组件也将使我们能够更快地进行创新。我们相信模块化和可重用性是数据库系统开发的未来,我们希望数据公司、学术界和个人数据库从业者都能够加入我们的行列。