十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache Arrow Linux 软件包构建指南:基于 Rake 与 Docker 一键产出 .deb 与 .rpm

Apache Arrow Linux 软件包构建指南:基于 Rake 与 Docker 一键产出 .deb 与 .rpm Apache Arrow Linux 软件包构建指南基于 Rake 与 Docker 一键产出 .deb 与 .rpm【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrowApache Arrow 仓库内置了一套完整的 Linux 二进制软件包构建流水线用于为 Arrow C 核心库与 GLib 绑定c_glib产出 Debian/Ubuntu 的.deb包和 AlmaLinux/Amazon Linux/CentOS 的.rpm包。本指南以 dev/tasks/linux-packages/README.md 为主体结合仓库内 Rake 任务、Docker 构建脚本与打包模板讲解如何构建全部或指定平台的软件包、如何进入容器控制台调试失败的构建以及整套流水线在源码层面的运行原理。读完本文你将能够在本地克隆仓库中直接驱动这套官方打包体系产出可用于自建 APT/YUM 仓库的 Arrow 二进制包。一、构建环境要求官方文档列出的前置条件只有三项Ruby用于运行 Rake 构建任务仓库中所有打包逻辑都以Rakefile Ruby 类实现Docker实际的编译打包发生在容器内部宿主机只需编排容器构建 Apache Arrow C 与 GLib 的 tar.gz 源码包的工具即git archive等生成上游源码归档的能力。从源码结构看dev/tasks/linux-packages/Rakefile 通过require_relative ../../release/binary-task与require_relative helper加载基础能力并维护了三个待构建的软件包packages [ apache-arrow, apache-arrow-apt-source, apache-arrow-release, ]其中apache-arrow是主体C 与 GLib 运行时/开发包apache-arrow-apt-source与apache-arrow-release分别是 APT 源包与 YUM 仓库配置包。顶层的apt:build、yum:build、version:update任务会依次进入每个包目录递归执行同名子任务。二、构建全部平台的 .deb 包官方给出的全量构建命令如下cd dev/tasks/linux-packages/apache-arrow rake version:update rake apt:buildrake version:update会先同步版本信息详见第五节rake apt:build则对所有默认启用的平台逐个产出.deb包。从 package-task.rb 中的apt_targets_default可以看出当前仓库默认启用的 APT 目标为debian-trixiedebian-forkyubuntu-jammyubuntu-nobleubuntu-resolute对应目录为 dev/tasks/linux-packages/apache-arrow/apt/另存在debian-trixie-arm64、ubuntu-noble-arm64等 arm64 变体目录但默认被注释禁用原因是「arm64 目标需要在宿主机上做额外配置」——若你的宿主是 aarch64仍可手动指定这些目标。注意顶层的 dev/tasks/linux-packages/Rakefile 也暴露了apt:build它会顺带构建apache-arrow-apt-source这个 APT 源配置包。若只想构建 Arrow 本体按官方文档进入apache-arrow子目录执行即可。三、构建指定平台的 .deb 包3.1 查看所有受支持的平台在仓库根目录执行以下命令即可列出 APT 侧全部受支持的平台目录名for x in dev/tasks/linux-packages/apache-arrow/apt/{debian,ubuntu}*; do basename $x; done输出即为各APT_TARGETS可用的取值例如debian-trixie、ubuntu-noble、ubuntu-resolute等。官方特别强调该命令必须从arrow克隆仓库的根目录执行因为其中使用了相对路径。3.2 用 APT_TARGETS 指定目标通过环境变量APT_TARGETS逗号分隔可以只构建关心的平台cd dev/tasks/linux-packages/apache-arrow rake version:update rake apt:build APT_TARGETSdebian-bookworm,ubuntu-noble从apt_targets的实现package-task.rb可以看到APT_TARGETS以逗号切分若未设置则回落到默认目标列表随后会逐一过滤只保留在apt/目录下真实存在对应子目录的目标。因此传入不存在的平台名会被静默跳过而不是报错。四、构建 .rpm 包4.1 全部平台构建cd dev/tasks/linux-packages/apache-arrow rake yum:build对应的默认 YUM 目标来自yum_targets_defaultalmalinux-10almalinux-9almalinux-8amazon-linux-2023centos-9-stream对应目录位于 dev/tasks/linux-packages/apache-arrow/yum/同样存在almalinux-9-aarch64等 aarch64 变体目录默认不启用。4.2 查看支持平台并指定目标for x in dev/tasks/linux-packages/apache-arrow/yum/{alma,amazon,centos}*; do basename $x; done指定平台则使用YUM_TARGETScd dev/tasks/linux-packages/apache-arrow rake yum:build YUM_TARGETSalmalinux-9,amazon-linux-2023五、调试构建进入容器控制台编译失败时全自动构建脚本会在出错时立即退出难以排查。为此打包框架提供了apt:build:console与yum:build:console两个交互式任务它们会照常准备源码、挂载目录但不自动执行构建脚本而是打开一个 Bash 提示符让你手动操作。5.1 调试 .deb 构建cd dev/tasks/linux-packages/apache-arrow rake version:update rake apt:build:console APT_TARGETSdebian-bookworm官方示例展示了宿主与容器内的协作方式host$ rake apt:build:console APT_TARGETSdebian-bookworm container$ /host/build.sh进入容器后执行/host/build.sh即可启动.deb构建即使构建失败Bash 会话也会保留你可以在现场查看日志、检查/build目录、手动重跑debuild等完成排查后再退出。5.2 调试 .rpm 构建cd dev/tasks/linux-packages/apache-arrow rake yum:build:console YUM_TARGETSalmalinux-9host$ rake yum:build:console YUM_TARGETSalmalinux-9 container$ /host/build.sh同样地容器内执行/host/build.sh触发rpmbuild失败后会话保留以供调试。从实现上看package-task.rb 的docker_runconsole: true时容器运行命令不追加/host/build.sh参数并以交互终端方式挂载当前目录到容器的/host:rw由于当前目录即apache-arrow包目录被挂载容器内才能访问/host/build.sh、/host/tmp/、/host/repositories/等路径。宿主机上若设置了BUILD_DIR环境变量还会额外将该目录挂载到容器的/build:rw保证构建中间产物落在宿主机上。六、构建流水线的源码级原理6.1 版本检测与归档准备rake version:update与构建任务都会先确定版本号。helper.rb 中的detect_version优先读取环境变量ARROW_VERSION否则解析 cpp/CMakeLists.txt 中的set(ARROW_VERSION ...)并把-SNAPSHOT后缀替换为-devYYYYMMDD日期取自ARROW_RELEASE_TIME环境变量或仓库最近一次 git 提交时间。版本号随后被解析为 Debian/RPM 两套语义package-task.rb版本形态Debian upstream 版本RPM 版本 / ReleaseX.Y.Z正式版X.Y.ZX.Y.Z/1X.Y.Z-rcN发布候选rc_build_type:releaseX.Y.ZX.Y.Z/1其他 dev/rc 形态X.Y.Z~devN或X.Y.Z~rcNX.Y.Z/0.Xrake version:update的具体工作define_version_task→update_debian_changelog/update_spec包括为各debian*目录的changelog追加一条New upstream release.条目署名取DEBFULLNAME/NAME或 git 用户信息以及向 arrow.spec.in 的%changelog写入新记录并重置Release。源码归档tar.gz的来源有三种define_archive_task正式版从 Apache 镜像下载、-rcN版本通过gh release download从 GitHub 拉取、其余形态直接用git archive HEAD从当前克隆生成。6.2 模板替换control.in 与 arrow.spec.in打包模板不是写死的。Debian 侧debian/control.in 内含USE_SYSTEM_OPEN_TELEMETRY、CUDA_ARCHITECTURE等占位符apache-arrow/Rakefile 中的apt_prepare_debian_control会按目标平台替换CUDA 架构arm64 目标可用any否则为i386 amd64OpenTelemetryubuntu-jammy/ubuntu-noble强制使用 bundled 版本其余平台优先使用系统opentelemetry-cpp-dev其中debian-trixie额外启用SYSTEM_OPEN_TELEMETRY_REQUIRE_GRPC。RPM 侧yum_build读取 arrow.spec.in将PACKAGE、VERSION、RELEASE替换后生成临时 spec 文件该 spec 内还根据 RHEL/Amazon Linux 版本条件化启用 bundled Abseil、GCS、gRPC、ORC 等功能例如use_bundled_absl、have_grpc等宏。6.3 Docker 容器编排对每个目标docker_runpackage-task.rb执行两步docker build以目标目录下的 Dockerfile或from文件描述的镜像为基础构建编译环境镜像。以 ubuntu-noble/Dockerfile 为例镜像内预装build-essential、cmake、meson、ninja-build、ccache、mold、GObject Introspection、valac、各类 Arrow 依赖库brotli/bz2/lz4/snappy/zstd/thrift/re2 等以及条件安装的nvidia-cuda-toolkitarm64 目标若不存在 Dockerfile则读取 from 指定基础镜像必要时自动切换到docker buildx build --platformlinux/arm64。docker run将包目录挂载到/host:rw将BUILD_DIR可选挂载到/build:rw并把DEBUG、DEB_BUILD_OPTIONS、RPM_BUILD_NCPUS等环境变量传入容器最终执行/host/build.sh。YUM 侧的 almalinux-9/Dockerfile 则预装gcc-toolset-12SCL 工具链、rpmdevtools、ccache以及boost-devel、thrift-devel、llvm-devel等构建依赖。6.4 容器内的实际构建脚本APTapt/build.sh容器启动后读取/host/env.sh由宿主机写入PACKAGE、VERSION按lsb_release判定发行版Debian 组件为mainUbuntu 为universe将源码包复制为${PACKAGE}_${VERSION}.orig.tar.gz按目标选择debian.platform-arch或通用debian目录然后执行debuild -us -uc。脚本默认启用 ccacheCCACHE_MAXSIZE3GiBDEB_BUILD_OPTIONS未设置时默认parallel$(nproc)并行编译并临时关闭随机构建目录后缀以保证可复现性。产物最终被收集到宿主机挂载目录下的repositories/dist/pool/codename/component/initial/package/。YUMyum/build.sh读取/host/env.sh中的SOURCE_ARCHIVE/PACKAGE/VERSION/RELEASE解析/etc/system-release-cpe判断发行版与版本含CentOS Stream后缀通过rpmdev-setuptree或手动建立rpmbuild目录树拷贝 spec 与源码包后执行rpmbuild -ba。若镜像设置了SCL如gcc-toolset-12还会通过scl enable切换工具链并对 annobin 插件做兼容处理。RPM 与 SRPM 分别输出到repositories/dist/version/arch/Packages与repositories/dist/version/Source/Packages。6.5 Debian 侧编译选项debian/rules 以dh $ --with gir驱动并通过override_dh_auto_configure向 CMake 传入一整套构建选项例如功能开关ARROW_COMPUTEON、ARROW_CSVON、ARROW_DATASETON、ARROW_FLIGHTON、ARROW_FLIGHT_SQLON、ARROW_GANDIVAON、ARROW_GCSON、ARROW_HDFSON、ARROW_JSONON、ARROW_MIMALLOCON、ARROW_ORCON、ARROW_PARQUETON、ARROW_S3ON工具链ARROW_USE_MOLDON使用 mold 链接器、ARROW_USE_CCACHEOFF由 debuild 层统一管理 ccache压缩/序列化依赖ARROW_WITH_BROTLI/BZ2/LZ4/SNAPPY/ZLIB/ZSTDON、ARROW_WITH_OPENTELEMETRYON构建类型relwithdebinfo并针对resolute等新发行版禁用 LTO 规避 GCC 15 崩溃。七、关键环境变量速查以下变量在整个打包流程中可直接影响行为均以宿主机环境传入 Rake/Docker变量作用默认值APT_TARGETS逗号分隔的 APT 目标列表全部默认平台YUM_TARGETS逗号分隔的 YUM 目标列表全部默认平台ARROW_VERSION覆盖自动检测的 Arrow 版本解析自 cpp/CMakeLists.txtARROW_RELEASE_TIME覆盖发布/构建时间用于 changelog 与 dev 版本号最近 git 提交时间DEBUG设为no关闭调试输出否则构建脚本输出详细日志并保留现场yesENV[DEBUG] ! no即视为开启BUILD_DIR宿主机构建目录挂载到容器/build不挂载DEB_BUILD_OPTIONS透传给 debuild默认parallel$(nproc)并行编译RPM_BUILD_NCPUS透传给 rpmbuild 的并行度由 spec 决定DEB_RELEASEDebian 包的 Debian revision1DEBFULLNAME/DEBEMAILchangelog 署名git 用户信息GITHUB_REPOSITORY影响 Docker 镜像名与 rc 归档下载仓库apache/arrow此外为了配合reprotest验证可复现构建APT 容器还会透传CPU_LIST、FAKETIME、HOME、LANG、LANGUAGE、LC_ALL、NO_FAKE_STAT、TZ等环境变量见 package-task.rb 的pass_through_env_names其中FAKETIME会通过LD_PRELOAD注入 libfaketime。八、注意事项与实践建议arm64 目标默认关闭apt_targets_default与yum_targets_default都把 aarch64 变体注释掉官方注释说明「需要宿主机额外配置」。在 x86_64 宿主上想构建 arm64 包时需依赖buildx跨架构模拟并自行确认基础镜像可用。正式版与 RC 版的归档来源不同-rcN版本依赖 GitHub CLIgh release download需要先配置gh认证正式版则从 Apache 镜像下载。先version:update再构建官方所有构建示例都先执行rake version:update因为它负责更新 changelog、spec 等元数据跳过它可能导致版本信息与归档不一致。产物目录.deb/.rpm最终输出在apache-arrow/apt/repositories/与apache-arrow/yum/repositories/下容器内以宿主机当前用户属主落盘该目录结构已按 Debian pool 与 YUM 仓库布局组织可直接配合apache-arrow-apt-source、apache-arrow-release两个辅助包搭建自己的分发源。可复现性构建脚本刻意固定了构建目录名避免 meson 生成的 pkgconfig 携带随机绝对路径配合FAKETIME/CPU_LIST等 reprotest 注入变量可用于验证同一版本在不同环境下的构建结果一致性。【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表