【免费下载链接】beam
Apache Beam is a unified programming model for Batch and Streaming data processing.
本指南基于 Apache Beam 仓库中 .test-infra/tools/README.md 及其同目录下的运维脚本,系统讲解 Beam 持续集成(CI)与测试基础设施中的两个核心环节:如何通过python_installer.sh为测试环境搭建 pyenv 并安装多版本 Python,以及如何借助一组stale_*_cleaner.sh脚本自动回收测试遗留的云端资源。读完本文,你将掌握 Beam 测试基础设施脚本的使用方式、修改方法,以及这些脚本的源码级实现原理。
工具背景:为什么 Beam 测试基础设施需要专门的 Python 环境工具
Apache Beam 提供 Java、Python、Go、Typescript 等多语言 SDK,其中 Python SDK 的测试矩阵需要覆盖多个 Python 主版本。在 Beam 的测试基础设施(位于仓库根目录 .test-infra 下)中,构建与测试任务往往运行在临时准备的机器上,需要在不同 Python 版本之间切换,并对每个版本进行隔离安装。
传统做法(如直接通过系统包管理器安装或编译源码)存在两个问题:一是版本切换繁琐,二是编译安装的依赖容易污染系统环境。因此 Beam 选择了pyenv + Python 官方安装器的方案:pyenv 负责管理多个 Python 版本的下载、编译与全局/局部切换,而python_installer.sh则把 pyenv 的安装、依赖准备、版本安装与环境变量配置封装成一个一键脚本。
该工具的定位可以从 README 的描述中确认:它负责"安装 pyenv 及其依赖,以及通过 pyenv 安装不同版本的 Python",并且只为运行该脚本的用户安装,不会改动系统其他用户的环境——这对于多租户的测试机器或共享 CI 节点而言是重要的隔离保证。
使用方式:一键安装 pyenv 与多版本 Python
根据 README 的说明,使用方式非常简单:下载脚本后直接以 bash 执行即可:
bash ./python_installer.sh执行后脚本会依次完成以下工作(对应 python_installer.sh 中的函数):
- 准备编译依赖(
pyenv_dep):通过apt-get update与apt-get install安装 pyenv 编译 Python 所需的系统包,包括make、build-essential、libssl-dev、zlib1g-dev、libbz2-dev、libreadline-dev、libsqlite3-dev、wget、curl、llvm、libncursesw5-dev、xz-utils、tk-dev、libxml2-dev、libxmlsec1-dev、libffi-dev、liblzma-dev等(需要 sudo 权限)。 - 安装 pyenv(
pyenv_install):如果$HOME/.pyenv目录或安装器脚本已存在则先清理,再通过curl下载 pyenv 官方安装器并执行。 - 配置用户环境(
pyenv_post_install):在~/.bashrc中追加 pyenv 配置块(设置PYENV_ROOT、PATH,并初始化pyenv init与pyenv virtualenv-init)。脚本会先检查~/.bashrc中是否已有# pyenv Config标记,避免重复追加。 - 安装指定版本的 Python(
pyenv_versions_install):遍历版本数组,逐个调用pyenv install编译安装。 - 设置全局版本(
python_versions_setglobally):把数组中的版本依次设为 pyenv 全局版本(pyenv global ...)。 - 清理并提示(
clean):删除临时下载的安装器脚本,并提示用户重启 shell(exec $SHELL)使 PATH 变更生效。
脚本开头启用了set -euo pipefail,任何一步失败都会立即终止,保证安装过程的确定性。
修改要安装的 Python 版本
Beam 需要支持的 Python 版本随 SDK 支持的版本范围演进,因此 README 明确说明:修改脚本中python_versions_arr变量即可增删要安装的版本。该变量位于 python_installer.sh 顶部:
原始定义:
python_versions_arr=("3.8.16" "3.9.16" "3.10.10" "3.11.4")例如改为:
python_versions_arr=("3.8.10" "3.9.0" "3.10.2")修改后重新执行bash ./python_installer.sh即可。需要说明的是:
- 数组中每个版本号都会触发一次完整的 pyenv 编译安装,耗时取决于机器性能;
- 数组顺序同时决定了
pyenv global的最终状态——从脚本第 71-73 行的pyenv global "$@"实现看,数组最后一个元素会成为生效的全局版本; - 该数组会被
pyenv_versions_install与python_versions_setglobally两个函数共享,因此增删版本时只需修改这一处。
同目录下的测试资源清理工具
.test-infra/tools 目录下除了 Python 安装器,还存放着一组以stale_*命名的清理脚本,用于回收 Beam 集成测试在 Google Cloud 上遗留的资源(主要针对项目apache-beam-testing)。README 中明确要求"新增或更新工具时必须同步更新本文件"(见文件开头的提示语),但目前这些清理脚本尚未写入 README,以下内容依据各脚本源码整理,可作为使用与维护参考:
BigQuery 数据集清理(stale_bq_datasets_cleaner.sh)
- 列出项目
apache-beam-testing下最多 1500 个数据集,与一组命名模板(如beam_bigquery_samples_、beam_temp_dataset_、FHIR_store_、bq_query_schema_update_options_16、game_stats_、python_等,以及匹配形如bq_read_all_xxx...12位十六进制的正则)匹配; - 宽限期为5 天:从 BigQuery API 读取的
lastModifiedTime(毫秒)转换为秒后,早于 5 天前且匹配模板的数据集才会被bq rm -r -f删除; - 脚本统计删除失败的次数,若存在失败则以非零状态退出,便于 CI 捕获。
Cloud Bigtable 实例清理(stale_cbt_instances_cleaner.sh)
- 通过
cbt listinstances获取前 50 个实例,匹配bt-read-tests、bt-write-xlang或test[a-z]+等模板; - 从实例名中解析创建日期(形如
模板-YYYYMMDD-的 8 位日期),超过 5 天宽限期即执行cbt deleteinstance; - 脚本对 Linux 与 macOS 分别处理
date命令的差异。
Dataflow 作业清理(stale_dataflow_jobs_cleaner.sh)
- 使用
gcloud dataflow jobs list --created-before=-P3H --status=active --region=us-central1列出创建超过 3 小时的活跃作业并逐一cancel;没有陈旧作业时打印No stale jobs found.。
预构建 SDK 容器镜像清理(stale_dataflow_prebuilt_image_cleaner.sh)
- 面向
gcr.io/apache-beam-testing(公开仓库,如beam-sdk、beam_portability、beamgrafana等)与us.gcr.io/apache-beam-testing(私有仓库,如java-postcommit-it、python-postcommit-it、jenkins、github-actions); - 公开镜像删除早于6 周(与发布周期对齐)的标签,私有镜像删除早于3 天的标签;始终保留带
latest标签以及时间上最新的一张镜像,避免仓库被清空; - 对多架构(multiarch)镜像通过
docker manifest inspect检查其依赖关系,仅在依赖可安全删除时才清理。
Kubernetes 命名空间清理(stale_k8s_workload_cleaner.sh)
- 获取 GKE 集群
io-datastores(区域us-central1-a,项目apache-beam-testing)的凭据,遍历所有命名空间; - 删除名称匹配
^beam-.+(test|-it)且存在时间达到阈值的命名空间:天(d)或年(y)级直接删除,小时(h)级要求不小于 8 小时(should_teardown函数实现)。
Spanner 数据库清理(stale_spanner_cleaner.sh)
- 列出
beam-test实例中createTime早于 1 天的数据库,通过gcloud spanner databases delete逐个静默删除。
使用与维护注意事项
从源码可以总结出以下实践要点:
- 权限要求:
python_installer.sh的依赖安装与旧目录清理使用sudo,需要当前用户具备 sudo 权限;pyenv 本身及其安装的 Python 版本只写入$HOME,符合 README 所述"仅针对运行用户"的隔离原则。 - 幂等性:脚本会在安装前删除旧的
~/.pyenv与临时安装器,并在写入~/.bashrc前检查标记,重复执行不会产生重复配置。 - 平台差异:多个清理脚本都针对
linux-gnu与darwin分别处理date命令语法,说明这些工具同时面向 Linux CI 节点与本地 macOS 开发/维护环境。 - CI 友好:清理脚本普遍在末尾根据失败计数决定退出码,未成功删除资源时返回非零状态,便于接入 Jenkins 等 CI 系统(Beam 的 Jenkins 任务定义位于 .test-infra/jenkins)。
- 维护约定:按 README 的要求,任何新增或修改的测试基础设施工具都应在 .test-infra/tools/README.md 中同步记录说明,保持文档与脚本的一致性。
【免费下载链接】beam
Apache Beam is a unified programming model for Batch and Streaming data processing.
相关推荐
Apache Beam 测试基础设施工具指南:用 python_installer.sh 通过 pyenv 批量安装 Python 版本
Apache Beam 测试基础设施工具指南:用 python_installer.sh 通过 pyenv 批量安装 Python 版本 Apache Beam
大数据批处理流处理数据工程Terratest 测试资源清理指南:用 defer + DestroyContext 确保基础设施测试不留任何残留
Terratest 测试资源清理指南:用 defer + DestroyContext 确保基础设施测试不留任何残留 自动化测试一旦由 Terratest 驱动
测试开发工具DevOps质量保障Apache Beam 测试基础设施:使用 Kustomize 在 Kubernetes 上安装 Strimzi Kafka Operator
Apache Beam 测试基础设施:使用 Kustomize 在 Kubernetes 上安装 Strimzi Kafka Operator 导读 本文围绕
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考