Meta正在推出Velox,这是一个开源统一执行引擎,旨在加速数据管理系统并简化其开发。
Velox正在积极开发中。我们在年超大型数据库国际会议(VLDB)上发表的论文的实验结果显示了Velox如何提高数据管理系统的效率和一致性。
Velox以我们认为对行业有益的方式帮助整合和统一数据管理系统。我们希望更大的开源社区能够加入我们为该项目做出贡献。
Meta的基础设施在支持我们的产品和服务方面发挥着重要作用。我们的数据基础架构生态系统由数十个专门的数据计算引擎组成,所有这些引擎都专注于各种用例的不同工作负载,从SQL分析(批处理和交互式)到事务工作负载、流处理、数据摄取等。最近,Meta基础设施中人工智能(AI)和机器学习(ML)用例的快速增长导致针对特征工程、数据预处理和其他用于ML训练和服务管道的工作负载的引擎和库。
然而,尽管有相似之处,但这些引擎在很大程度上是独立发展的。这种碎片化使得维护和增强它们变得困难,特别是考虑到随着工作负载的发展,执行这些工作负载的硬件也会发生变化。最终,这种碎片化导致系统具有不同的功能集和不一致的语义——降低了需要与多个引擎交互以完成任务的数据用户的生产力。
为了应对这些挑战并为我们自己的产品和世界创建更强大、更高效的数据基础架构,Meta创建并开源了Velox。这是一个新颖的、最先进的统一执行引擎,旨在加速数据管理系统并简化其开发。Velox统一了数据计算引擎的常见数据密集型组件,同时仍可扩展和适应不同的计算引擎。它将以前仅在单个引擎中实现的优化民主化,提供了一个可以实现一致语义的框架。这减少了工作重复,提高了可重用性,并提高了整体效率和一致性。
Velox正在积极开发中,但它已经处于与Meta的十几个数据系统集成的不同阶段,包括Presto、Spark和PyTorch(后者通过一个名为TorchArrow的数据预处理库)以及其他内部流处理平台、事务引擎、数据摄取系统和基础设施、用于特征工程的ML系统等。
Velox开源项目自首次上传到GitHub以来,已经吸引了超过名代码贡献者,其中包括Ahana、Intel和VoltronData等关键合作者,以及各种学术机构。通过为Velox开源和培育社区,我们相信我们可以加快数据管理系统开发行业的创新步伐。我们希望更多的个人和公司加入我们的行列。
Velox概述
虽然数据计算引擎一开始可能看起来不同,但它们都由一组相似的逻辑组件组成:语言前端、中间表示(IR)、优化器、执行运行时和执行引擎。Velox提供了实现执行引擎所需的构建块,包括在单个主机内执行的所有数据密集型操作,例如表达式评估、聚合、排序、连接等-通常也称为数据平面。因此,Velox期望一个优化的计划作为输入,并使用本地主机中的可用资源有效地执行它。
Presto和Spark等数据管理系统通常有自己的执行引擎和其他组件。Velox可以作为跨不同数据管理系统的通用执行引擎。(菲利普·贝尔的图表。)
Velox利用了许多运行时优化,例如过滤器和联合重新排序、数组和基于哈希的聚合和连接的键规范化、动态过滤器下推和自适应列预取。考虑到从传入的数据批次中提取的可用知识和统计数据,这些优化提供了最佳的本地效率。由于复杂数据类型在现代工作负载中无处不在,Velox还从头开始设计,以有效支持复杂数据类型,因此广泛依赖字典编码来进行基数增加和基数减少操作(例如连接和过滤),同时仍为原始数据类型。
Velox提供的主要组件有:
类型:一种通用类型系统,允许开发人员表示标量、复杂和嵌套数据类型,包括结构、映射、数组、函数(lambda)、小数、张量等。
Vector:与ApacheArrow兼容的列式内存布局模块,支持多种编码,例如平面、字典、常量、序列/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。
Presto—Prestissimo
Velox作为Prestissimo项目的一部分被集成到Presto中,其中PrestoJava工作人员被基于Velox的C++进程所取代。该项目最初由Meta于年创建,目前正在与Ahana以及其他开源贡献者合作继续开发。
Prestissimo提供Presto的HTTPREST接口的C++实现,包括工作人员到工作人员的交换序列化协议、协调员到工作人员的编排和状态报告端点,从而为Presto工作人员提供了C++替代品。主要查询工作流程包括从Java协调器接收Presto计划片段,将其转换为Velox查询计划,并将其交给Velox执行。
我们进行了两个不同的实验来探索Velox在Presto中提供的加速。我们的第一个实验使用了TPC-H基准测试,并在一些CPU密集型查询中测量了接近一个数量级的加速。对于shuffle-bound查询,我们看到了更适度的加速(平均3-6倍)。
尽管TPC-H数据集是标准基准,但它并不代表实际工作负载。为了探索Velox在这些场景中的表现,我们创建了一个实验,在该实验中我们执行了由Meta上的各种交互式分析工具生成的生产流量。在这个实验中,我们看到数据查询的平均速度提高了6-7倍,其中一些结果将速度提高了一个数量级以上。您可以在我们的研究论文中了解有关实验细节及其结果的更多信息。
Presissimo在实际分析工作负载上的结果。上面的直方图显示了Prestissimo相对于PrestoJava的相对加速。y轴表示查询的数量(以千[K]为单位)。x轴为零表示PrestoJava更快;10表示Prestissimo至少比PrestoJava快10倍。
Presissimo的代码库
可在GitHub上找到。
Spark—Gluten
Velox也被集成到Spark中,作为英特尔创建的Gluten项目的一部分。Gluten允许在执行SparkSQL查询时在Spark环境中使用C++执行引擎(例如Velox)。Gluten通过创建基于ApacheArrow数据格式和Substrait查询计划的JNIAPI将SparkJVM和执行引擎解耦,因此只需与Gluten的JNIAPI集成,就可以在Spark中使用Velox。
Gluten的代码库可在GitHub上找到。
TorchArrow
TorchArrow是一个数据框Python库,用于深度学习中的数据预处理,是PyTorch项目的一部分。TorchArrow在内部将数据帧表示形式转换为Velox计划,并将其委托给Velox执行。除了融合ML数据预处理库原本分散的空间之外,这种集成还允许Meta整合分析引擎和ML基础设施之间的执行引擎代码。它通过公开相同的函数/UDF集并确保跨引擎的一致行为,为ML最终用户提供更一致的体验,这些最终用户通常需要与不同的计算引擎交互以完成特定任务。
TorchArrow最近在GitHub上以beta模式发布。
数据库系统发展的未来
Velox证明,通过将数据计算系统的执行引擎整合到一个统一的库中,可以使数据计算系统更具适应性。随着我们继续将Velox集成到我们自己的系统中,我们致力于建立一个可持续的开源社区来支持该项目,并加快图书馆的开发和行业采用。我们也有兴趣通过统一这些孤岛之间的功能包和语义来继续模糊ML基础设施和传统数据管理系统之间的界限。
展望未来,我们相信Velox的统一和模块化特性有可能造福于利用数据管理系统的行业,尤其是那些开发数据管理系统的行业。它将使我们能够与硬件供应商合作,并随着硬件的进步主动调整我们的统一软件堆栈。随着数据工作负载的发展,重用统一且高效的组件也将使我们能够更快地进行创新。我们相信模块化和可重用性是数据库系统开发的未来,我们希望数据公司、学术界和个人数据库从业者都能够加入我们的行列。
关于Velox和这些组件的深入文档可以在我们的网站和我们的研究论文“Velox:Meta的统一执行引擎”中找到。