Apache Airflow HDFS Provider 4.13.0:从官方源码包安装与发布完整性验证
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
本文基于 Apache Airflow 仓库中 HDFS 提供商的安装文档 providers/apache/hdfs/docs/installing-providers-from-sources.rst,完整讲解如何从 Apache 软件基金会官方发布渠道下载apache-airflow-providers-apache-hdfs的源码包、sdist 与 whl 三种制品,如何用 PGP 签名与 SHA512 校验和验证其完整性,以及如何对 PyPI 上的 whl 包做同样的端到端核验。读完后,你能够独立完成该 Provider 包的官方渠道安装、发布溯源(provenance)验证与供应链安全检查。
文档溯源:这一页是如何从仓库模板生成的
HDFS Provider 的 "Installing from sources" 文档本体只有一行有效内容——一个跨目录的 RST include:
.. include:: /../../../../devel-common/src/sphinx_exts/includes/installing-providers-from-sources.rst也就是说,所有 Provider 共享同一份安装文档模板 devel-common/src/sphinx_exts/includes/installing-providers-from-sources.rst。模板中的下载链接、包名和版本号并不是写死的,而是通过sphinx-jinja的official_download_page上下文在构建文档时动态填充。填充逻辑位于 devel-common/src/docs/provider_conf.py:
"official_download_page": { "base_url": "https://downloads.apache.org/airflow/providers", "closer_lua_url": "https://www.apache.org/dyn/closer.lua/airflow/providers", "package_name": PACKAGE_NAME, "package_name_underscores": PACKAGE_NAME.replace("-", "_"), "package_version": PACKAGE_VERSION, "providers_release_date": PROVIDERS_RELEASE_DATE, },其中PACKAGE_NAME由 HDFS Provider 的文档构建配置 providers/apache/hdfs/docs/conf.py 设置为apache-airflow-providers-apache-hdfs;PROVIDERS_RELEASE_DATE则读取仓库根providers目录下的.last_release_date.txt(路径定义在 devel-common/src/docs/provider_conf.py 中)。因此渲染出的最终文档,等价于把下面这些具体值代入模板:
| 模板变量 | HDFS Provider 的具体取值 |
|---|---|
package_name | apache-airflow-providers-apache-hdfs |
package_name_underscores | apache_airflow_providers_apache_hdfs |
package_version | 4.13.0(见 providers/apache/hdfs/pyproject.toml 与 providers/apache/hdfs/provider.yaml) |
base_url | https://downloads.apache.org/airflow/providers |
closer_lua_url | https://www.apache.org/dyn/closer.lua/airflow/providers |
这种"共享模板 + Jinja 变量"的组织方式意味着:理解一份 Provider 的安装文档,就理解了所有 Provider 的官方发布流程。
已发布的官方制品:三种下载形态及其来源
文档明确指出,已发布的包分为两类性质:
- Source packages(源码包):Apache 软件基金会的官方制品。如果你希望自行从源码构建包,并确保包的来源(provenance)经过验证、与仓库源码一致,就应该使用这类制品——你可以逐一校验它们的校验和与签名。
sdist与whl便捷包:同样由同一份源码构建安装而来,虽然更省事,但同样可以在 Apache 官方下载渠道获取,并验证其来源、校验和与签名。
针对 HDFS Provider 4.13.0,模板渲染出的具体下载项为(均以base_url为主分布目录):
- Providers 源码包(包含本批次发布的全体 Providers):
apache_airflow_providers-<providers_release_date>-source.tar.gz - Sdist 包:
apache-airflow-providers-apache-hdfs-4.13.0.tar.gz - Whl 包:
apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl
每一项制品都附带两个校验文件:
*.asc—— GPG 签名文件*.sha512—— SHA512 校验和文件
例如 sdist 对应apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.asc和apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.sha512。文档同时说明,也可以像大多数 Python 包一样直接从 PyPI 安装该版本,并在版本下拉框中选择其他历史版本。
如果你要从源码构建,文档指引你下载上面的 sources 包,其中包含一份INSTALL文件,详细说明如何构建和安装 Provider——仓库根目录同样维护着这份 INSTALL 文件,可对照阅读。
从源码看 sdist 是如何被打包的
HDFS Provider 的构建配置 providers/apache/hdfs/pyproject.toml 使用 flit 作为构建后端:
[build-system] requires = ["flit_core==4.0.2"] build-backend = "flit_core.buildapi"值得注意的是其[tool.flit.sdist]段(providers/apache/hdfs/pyproject.toml)显式列出了 sdist 需要携带的内容:
[tool.flit.sdist] include = [ "docs/", "provider.yaml", "src/airflow/__init__.py", "src/airflow/providers/__init__.py", "src/airflow/providers/apache/__init__.py", "tests/", ]源码注释解释了动机:这是为了构建不依赖 VCS 信息(flit 4.0 起--no-use-vcs成为默认行为)。换句话说,你从 Apache 官方下载的 sdist 是自包含的,解压后无需访问任何版本控制系统即可完成安装。
该包的运行依赖同样在 providers/apache/hdfs/pyproject.toml 中声明,安装前值得了解:
requires-python = ">=3.10" dependencies = [ "apache-airflow>=2.11.0", "apache-airflow-providers-common-compat>=1.12.0", 'hdfs[avro,dataframe,kerberos]>=2.5.4;python_version<"3.12"', 'hdfs[avro,dataframe,kerberos]>=2.7.3;python_version>="3.12"', 'fastavro>=1.10.0; python_version>="3.13" and python_version<"3.14"', 'fastavro>=1.12.1; python_version>="3.14"', 'pandas>=2.1.2; python_version <"3.13"', 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"', 'pandas>=2.3.3; python_version >="3.14"', ]可见hdfs、fastavro、pandas的版本下限都按 Python 小版本做了条件化裁剪,Python 3.10 起受支持。包的安装入口点声明在 providers/apache/hdfs/pyproject.toml:
[project.entry-points."apache_airflow_provider"] provider_info = "airflow.providers.apache.hdfs.get_provider_info:get_provider_info"Provider 的元数据(名称、生命周期状态production、全部历史版本列表、集成的 hooks/sensors/logging 组件)则集中在 providers/apache/hdfs/provider.yaml,可作为核实你安装版本是否属于官方发布序列的参照。
发布完整性验证(Release integrity):PGP 签名与 SHA512 校验
文档强调:必须使用 PGP 或 SHA 签名验证下载文件的完整性。签名验证需要两步:先导入发布管理者的公钥,再对制品本身验签。文档特别提示,KEYS公钥文件与对应的.asc签名文件都应从主分布目录获取,而不是从镜像站获取。
第一步:导入公钥
从 PGP 签名 KEYS 文件导入(KEYS随 Airflow 发布目录提供,需自行下载):
gpg -i KEYS或使用其他等价工具:
pgpk -a KEYSpgp -ka KEYS第二步:验证签名
对下载好的制品与签名文件执行验证。以 HDFS Provider 的 sdist 为例,文档给出的通用命令形式为:
gpg --verify apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.asc apache-airflow-providers-apache-hdfs-4.13.0.tar.gz其他工具的等价形式:
pgpv apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.ascpgp apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.asc解读验证输出
文档附带的示例输出(模板中的示例输出,其签名者信息以你实际导入的KEYS为准):
$ gpg --verify apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.asc apache-airflow-providers-apache-hdfs-4.13.0.tar.gz gpg: Signature made Sat 11 Sep 12:49:54 2021 BST gpg: using RSA key CDE15C6E4D3A8EC4ECF4BA4B6674E08AD7DE406F gpg: issuer "kaxilnaik@apache.org" gpg: Good signature from "Kaxil Naik <kaxilnaik@apache.org>" [unknown] gpg: aka "Kaxil Naik <kaxilnaik@gmail.com>" [unknown] gpg: WARNING: The key's User ID is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: CDE1 5C6E 4D3A 8EC4 ECF4 BA4B 6674 E08A D7DE 406F两点关键解读(原文档明确说明):
Good signature from ...表示签名校验通过,制品未被篡改;- 不必担心
not certified with a trusted signature警告:大多数发布管理者的证书是自签的,所以会出现此提示。由于你上一步已经从官方KEYS页按 ID 导入了该密钥,就已经确认它是一把有效密钥。
第三步:SHA512 校验和比对
下载对应的.sha512文件后执行:
shasum -a 512 apache-airflow-providers-apache-hdfs-4.13.0.tar.gz | diff - apache-airflow-providers-apache-hdfs-4.13.0.tar.gz.sha512文件实际计算出的SHASUM必须与.sha512文件中提供的值一致。对 whl 包同理,将文件名替换为apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl即可。
验证 PyPI 上的发布:端到端核验脚本
如果你最终从 PyPI 安装了该 Provider 的.whl包,同样可以核验其官方性。文档提供的方法是:本地用pip download拉取 PyPI 上的制品,同时用curl从 Apache 主分布目录拉取该 whl 对应的.asc与.sha512文件,然后按上一节的流程验证。
将模板中的变量代入 HDFS Provider 后的完整脚本如下:
#!/bin/bash PACKAGE_VERSION=4.13.0 PACKAGE_NAME=apache-airflow-providers-apache-hdfs provider_download_dir=$(mktemp -d) pip download --no-deps "${PACKAGE_NAME}==${PACKAGE_VERSION}" --dest "${provider_download_dir}" curl "https://downloads.apache.org/airflow/providers/apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl.asc" \ -L -o "${provider_download_dir}/apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl.asc" curl "https://downloads.apache.org/airflow/providers/apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl.sha512" \ -L -o "${provider_download_dir}/apache_airflow_providers_apache_hdfs-4.13.0-py3-none-any.whl.sha512" echo echo "Please verify files downloaded to ${provider_download_dir}" ls -la "${provider_download_dir}" echo脚本要点:
pip download --no-deps只下载 whl 本身,不拉取依赖树,保证被验证对象唯一;.asc/.sha512一律来自 Apache 主分布目录(downloads.apache.org/airflow/providers),这正是文档"KEYS 与签名文件应来自主分布目录而非镜像"原则的落地;- 下载完成后,对临时目录中的 whl 执行"PGP 验签 + SHA512 比对"两步(见上一节),验证通过后再删除临时目录。
小结:从源码到签名的一条溯源链
把仓库证据与文档流程串起来,HDFS Provider 的官方发布链路是清晰且可复核的:
- 构建:源码位于 providers/apache/hdfs/ 目录,由 flit_core 4.0.2 按 providers/apache/hdfs/pyproject.toml 构建,sdist 内容清单显式声明、不依赖 VCS 信息;
- 发布:以 Apache 软件基金会官方制品形式发布 providers source、sdist、whl 三类包,每件附带
.asc与.sha512; - 文档:各 Provider 的安装页由共享模板 devel-common/src/sphinx_exts/includes/installing-providers-from-sources.rst 加上 devel-common/src/docs/provider_conf.py 中的 Jinja 上下文渲染生成,HDFS Provider 的具体取值(包名、下划线包名、版本 4.13.0、主分布目录)完全由仓库内配置决定;
- 验证:无论走 Apache 官方下载还是 PyPI,最终都以"
KEYS导入 +gpg --verify+shasum -a 512 | diff"同一套流程收口。
适用前提提示:本文所有包名、版本号与依赖约束均取自当前仓库快照中的 HDFS Provider 4.13.0 配置;若切换其他 Provider 或其他版本,只需按上文表格替换package_name、package_name_underscores、package_version三个变量,流程与命令形态完全不变。
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考