facebookincubator/velox

GitHub: facebookincubator/velox

一个由 Meta 主导的高性能、可扩展 C++ 分布式执行引擎库,为数据管理系统提供可复用的向量化计算组件。

Stars: 4097 | Forks: 1491

Velox logo [![Linux Build using GCC](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/9f1c87ef12190641.svg)](https://github.com/facebookincubator/velox/actions/workflows/linux-build.yml) [![macOS Build](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4bd47111ce190642.svg)](https://github.com/facebookincubator/velox/actions/workflows/macos.yml) Velox 是一个可组合的分布式执行引擎,以开源 C++ 库的形式提供。它提供可重用、可扩展和高性能的数据处理 组件,可以(重新)用于构建专注于不同分析工作负载的数据管理系统,包括批处理、交互式、流式 处理以及 AI/ML。Velox 由 Meta 创建,目前正在与 IBM/Ahana、英特尔、Voltron Data、微软、字节跳动等 公司合作开发。 在常见的使用场景中,Velox 接收一个完全优化的查询计划作为输入 并执行描述的计算。考虑到 Velox 不提供 SQL 解析器、数据框层或查询优化器,它通常 不适用于终端用户直接使用;相反,它主要用于集成和优化其计算引擎的开发人员。 Velox 提供以下高级组件: * **Type**:一个支持标量、复杂和嵌套类型的通用类型系统,例如结构体、映射、数组等。 * **Vector**:[与 Arrow 兼容的列式内存布局 模块](https://facebookincubator.github.io/velox/develop/vectors.html), 提供 Flat、Dictionary、Constant 和 Sequence/RLE 等编码,以及惰性物化模式和乱序写入支持。 * **Expression Eval**:[完全向量化的表达式评估 引擎](https://facebookincubator.github.io/velox/develop/expression-evaluation.html) 允许在 Vector/Arrow 编码数据上高效执行表达式。 * **Functions**:遵循 Presto 和 Spark 语义的向量化标量、聚合和窗口函数实现集合。 * **Operators**:关系运算符的实现,例如扫描、写入、[投影、过滤、分组、排序、洗牌/交换](https://facebookincubator.github.io/velox/develop/joins.html)、 展开(unnest),以及更多。 * **I/O**:可扩展数据源和接收器的连接器接口, 支持不同的文件格式(ORC/DWRF、Parquet、Nimble),以及存储适配器 (S3、HDFS、GCS、ABFS、本地文件)供使用。 * **Network Serializers**:一个接口,不同的线协议可以实现,用于网络通信, 支持 [PrestoPage](https://prestodb.io/docs/current/develop/serialized-page.html) 和 Spark 的 UnsafeRow。 * **Resource Management**:一组用于处理计算资源的原始组件,例如 [内存 区域](https://facebookincubator.github.io/velox/develop/arena.html) 和 缓冲区管理、任务、驱动程序、线程池,用于 CPU 和线程执行、溢出和缓存。 Velox 是可扩展的,允许开发人员定义其自身引擎特定的 专业化,包括: 1. 自定义类型 2. [简单和向量化函数](https://facebookincubator.github.io/velox/develop/scalar-functions.html) 3. [聚合函数](https://facebookincubator.github.io/velox/develop/aggregate-functions.html) 4. 窗口函数 5. 运算符 6. 文件格式 7. 存储适配器 8. 网络序列化器 ## 示例 不同组件 API 的可扩展性和集成示例 [可在此处找到](velox/examples) ## 文档 开发者指南详细介绍了库的许多方面,以及可用函数列表 [可在此处找到.](https://facebookincubator.github.io/velox) 近期博客文章 ([所有文章](https://velox-lib.io/blog)): - [为什么 NULLIF 必须是一个特殊形式](https://velox-lib.io/blog/nullif-special-form) (2026-04-10) - [从不可靠的 Axiom CI 到 Velox 错误修复:一个跨仓库调试故事](https://velox-lib.io/blog/debugging-flaky-ci-across-repos) (2026-03-29) - [自适应每函数 CPU 时间跟踪](https://velox-lib.io/blog/velox-adaptive-cpu-sampling) (2026-03-26) ## 社区 Velox 是一个由个人贡献者和组织支持的开源项目。 该项目的技术治理机制在 [此文档](https://velox-lib.io/docs/community/technical-governance) 中描述。 项目维护者 [在此列出](https://velox-lib.io/docs/community/components-and-maintainers)。 与 Velx OSS 社区的主要沟通渠道是通过 [the Velox-OSS Slack 工作区](http://velox-oss.slack.com)、GitHub Issues 和 Discussions。 要访问 Velox Slack 工作区,请在 [此讨论](https://github.com/facebookincubator/velox/discussions/11348) 中添加评论。 ## 贡献 请查看我们的 [贡献指南](CONTRIBUTING.md) 以了解如何 为项目做贡献。 ## 许可证 Velox 根据 Apache 2.0 许可证授权。许可证的 [副本](LICENSE) 可以在此处找到。 ## 入门 ### 获取 Velox 源代码 ``` git clone https://github.com/facebookincubator/velox.git cd velox ``` 获取 Velox 源代码后,第一步是安装依赖项。 依赖项的详细信息以及 Velox 如何管理其中的一些依赖项 [可在此处找到](CMake/resolve_dependency_modules/README.md)。 Velox 还提供了以下脚本来帮助开发者为给定平台设置和安装 Velox 依赖项。 ### 支持的操作系统和编译器矩阵 支持的编译器最低版本: | 操作系统 | 编译器 | 版本 | |----|----------|---------| | Linux | gcc | 11 | | Linux | clang | 15 | | macOS | clang | 15 | 推荐的操作系统版本和编译器: | 操作系统 | 编译器 | 版本 | |----|----------|---------| | CentOS 9/RHEL 9 | gcc | 12 | | Ubuntu 22.04 | gcc | 11 | | macOS | clang | 16 | 替代组合: | 操作系统 | 编译器 | 版本 | |----|----------|---------| | CentOS 9/RHEL 9 | gcc | 11 | | Ubuntu 20.04 | gcc | 11 | | Ubuntu 24.04 | clang | 15 | ### 设置依赖项 以下安装脚本使用 `DEPENDENCY_DIR` 环境变量来设置 下载和构建软件包的位置。默认值为当前工作目录中的 `deps-download`。 使用 `INSTALL_PREFIX` 设置软件包的安装目录。默认值为 macOS 上的 `deps-install`,Linux 上默认为 安装位置(例如 `/usr/local`)。 在 macOS 上使用默认安装位置 `/usr/local` 是不推荐的,因为某些 Homebrew 版本会使用该位置。 手动在 IDE 或 Bash 环境中添加 `INSTALL_PREFIX` 值, 例如 `export INSTALL_PREFIX=/Users/$USER/velox/deps-install` 到 `~/.zshrc`,以便后续 Velox 构建可以使用已安装的软件包。 *您可以为 Velox 客户端(如 Prestissimo)重用 `DEPENDENCY_INSTALL` 和 `INSTALL_PREFIX`,通过指定一个共享目录。* 依赖项构建的并行度可以通过 `BUILD_THREADS` 环境变量控制, 并覆盖用于编译和链接的默认并行进程数。 默认值为机器的核心数。 这在您的机器拥有大量核心但没有足够内存来并行处理所有 编译和链接进程时非常有用,以避免内核因 OOM 而杀死进程。 ### 在 macOS 上设置 在 macOS 机器(Intel 或 Apple Silicon)上,您可以按如下方式设置并构建: ``` $ ./scripts/setup-macos.sh $ make ``` 如果 macOS 14.4 且 XCode 15.3 缺少 `m4`,您可以 1. 通过 `brew` 安装 `m4`: ``` $ brew install m4 $ export PATH=/opt/homebrew/opt/m4/bin:$PATH ``` 2. 或使用 `gm4` 替代: ``` $ M4=/usr/bin/gm4 make ``` ### 在 Ubuntu(20.04 或更高版本)上设置 支持架构为 x86_64(avx、sse)和 AArch64(apple-m1+crc、neoverse-n1)。 您可以按如下方式构建: ``` $ ./scripts/setup-ubuntu.sh $ make ``` ### 在 CentOS 9 Stream 上设置适配器 Velox 适配器包括文件系统,例如 AWS S3、Google Cloud Storage、 以及 Azure Blob File System。这些适配器需要安装额外的 库。获取 Velox 后,您可以按如下方式设置并构建: ``` $ ./scripts/setup-centos9.sh $ ./scripts/setup-centos9.sh install_adapters $ make ``` 请注意,`install_adapters` 命令适用于支持的 macOS 和 Ubuntu(20.04 或更高版本)脚本。可以通过指定单独的安装命令来安装单个适配器, 例如 `setup-centos9.sh install_aws`。 ### 在 Linux 上使用 Clang Clang 15 可以在设置步骤中额外安装在 Ubuntu 22.04/24.04 和 CentOS 9 上,方法是设置 `USE_CLANG` 环境变量 在运行特定于平台的安装脚本之前。 ``` $ export USE_CLANG=true ``` 这将安装并使用 Clang 15 来构建依赖项,而不是使用默认的 GCC 编译器。 完成后,在运行任何 `make` 命令之前,设置要使用的编译器: ``` $ export CC=/usr/bin/clang-15 $ export CXX=/usr/bin/clang++-15 $ make ``` ### 构建 Velox 在根目录运行 `make` 以编译源代码。对于开发,使用 `make debug` 构建非优化调试版本,或 `make release` 构建 优化版本。使用 `make unittest` 构建并运行测试。 四个测试套件在 Linux CI 上使用分组二进制文件以减少链接时间 (`velox/exec/tests`、`velox/functions/prestosql/aggregates/tests`、 `velox/common/caching/tests`、`velox/serializers/tests`)。其他所有套件在所有平台上使用独立二进制文件。 在 macOS 上,默认情况下关闭分组。要在 Linux 上禁用分组,请通过 `EXTRA_CMAKE_FLAGS` 传递 `-DVELOX_ENABLE_GROUPED_TESTS=OFF`。 请注意, * Velox 需要最低版本的编译器 GCC 11.0 或 Clang 15.0。 * Velox 需要 CPU 支持以下指令集: * bmi * bmi2 * f16c * Velox 尝试在可用时使用以下(或等效)指令集: * 在 Intel CPU 上 * avx * avx2 * sse * 在 ARM 上 * Neon * Neon64 Velox 构建指标发布在 ### 使用 docker-compose 构建 Velox 如果您不想安装构建 Velox 所需的系统依赖项, 您也可以使用 [docker-compose](https://docs.docker.com/compose/) 构建并在容器内运行 Velox 测试。 使用以下命令: ``` $ docker-compose build ubuntu-cpp $ docker-compose run --rm ubuntu-cpp ``` 如果希望增加或减少构建 Velox 时使用的线程数, 可以通过执行以下操作来覆盖 `NUM_THREADS` 环境变量: ``` $ docker-compose run -e NUM_THREADS= --rm ubuntu-cpp ```
标签:AI/ML 处理, Arrow 兼容, C++ 执行引擎, Meta, Velox, 交互式查询, 代码示例, 内存布局, 列式存储, 可组合执行引擎, 向量化执行, 开源库, 批处理, 搜索引擎爬虫, 数据分析, 数据管理, 数据集成, 流处理, 类型系统, 表达式评估, 计算引擎优化, 高性能计算