书名:Airflow实战
ISBN:978-7-115-62377-5
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 朱鹏程
责任编辑 秦 健
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书由浅入深地介绍了如何快速搭建Airflow集群,包括不同操作系统的快速搭建方法、Airflow的安装方法、Airflow集群的部署方法、Airflow中的核心概念和其他重要概念、Airflow的架构和组件、Airflow的系统管理、实践经验以及其他常见的调度系统。附录提供了Docker和Kubernetes的简介。此外,本书还提供了在生产环境中使用Airflow的诸多实践与经验,无论是对研发工程师创建工作流、排查工作流问题,还是对运维工程师维护集群运转、优化集群性能,都有极其重要的借鉴价值。
本书图文并茂,理论翔实,示例丰富,适合正在使用或者即将使用Airflow作为调度系统的研发工程师、Airflow平台的运维工程师以及对Airflow感兴趣的读者阅读。
Airflow是Apache软件基金会负责的顶级项目。作为一个工作流(workflow)平台,用户可以使用Airflow创建、调度和监控工作流。目前,国内外众多公司将Airflow作为内部的调度系统解决方案。然而,有关Airflow的资料却略显匮乏。笔者2019年首次接触Airflow,此后对Airflow的功能迭代和系统演进一直保持着浓厚兴趣并持续关注。机缘巧合之下,又于2021年年初开始参与Airflow在某大型互联网公司的落地和推广,从而积累了很多相关的经验。为了让更多的读者熟练掌握Airflow,笔者将自己对Airflow的实践经验整理成书。希望本书可以帮助读者轻松学习Airflow的使用方法和运作原理。
本书基于Airflow 2.2.4版本,涵盖Airflow的安装部署、重要概念、核心原理、架构和组件、系统管理等诸多内容。
对于更高版本的Airflow,本书结合具体的示例介绍了相关新功能。
此外,本书还提供了在生产环境使用Airflow的诸多实践,不管是对研发工程师创建工作流、排查工作流问题,还是对运维工程师维护集群运转、优化集群性能,都有极其重要的借鉴价值。
本书图文并茂,理论翔实,示例丰富,可以作为Airflow的全方位技术指南。
本书适合如下读者阅读。
● 正在使用或者即将使用Airflow作为调度系统的研发工程师。本书涵盖Airflow 2.2.4版本的全部功能,并配备了大量的示例和讲解,非常适合作为Airflow的入门学习资料。此外,本书还包含对Airflow源代码的解读和系统架构的分析,相信这部分内容对于想要深入了解Airflow的中高级工程师也是有帮助的。
● Airflow平台的运维工程师。本书记录了许多Airflow运维方面的实践经验和经典示例。书中的调优方法和排查手段将会对系统运维工程师的日常工作有直接的帮助。
● 其他对Airflow感兴趣的读者。深入了解Airflow这样的开源项目对开发人员自身的编码能力、系统架构的设计能力等都会有很大的帮助。
如果你是第一次接触Airflow,建议按照顺序阅读本书,并且参考书中的示例进行编码和实战。如果你已经对Airflow有一定的了解,可以把本书当成参考手册,直接查看需要学习的章节。以下是各章的基本介绍。
第1章介绍快速搭建集群的方法,Linux操作系统、macOS、Windows 10操作系统的用户都可以在其中找到对应的方案。
第2章介绍安装Airflow的方法,这一部分内容主要针对Ubuntu 20.04操作系统,使用Ubuntu其他版本或者使用其他Linux发行版的用户需要根据系统做适当的调整。
第3章介绍Airflow集群的部署方法,分为容器环境和非容器环境两部分。
第4章介绍Airflow中的核心概念——DAG、Task、DAG Run和Task Instance。
第5章介绍Airflow中的其他重要概念——XCom、Variable、Connection和Hook、Pool、Priority Weight、Cluster Policy以及Deferrable Operator和Trigger。
第6章介绍Airflow的架构和组件。Airflow有多种架构,各有优劣。
第7章介绍Airflow的系统管理,内容包括配置、安全、日志和监控、插件、模块管理、CLI、时区等。
第8章介绍实践经验,主要是笔者管理和运维Airflow集群的经验总结。
第9章介绍Airflow 2.3版本、2.4版本、2.5版本的新功能。
第10章介绍其他常见的调度系统,并且将它们与Airflow进行比较。
附录A为Docker简介。
附录B为Kubernetes简介。
由于编写时间仓促,笔者水平有限,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。期待能够得到你们的真挚反馈。
感谢人民邮电出版社的秦健老师,在这一年多的时间中他始终支持我的写作,他的鼓励和帮助引导我顺利完成全部书稿。
感谢我的领导殷钢先生,他在我面临职场困境时给予了很大的帮助和支持。感谢我的同事吴劼平先生,他与我一道在公司层面进行Airflow项目的推广,我从他身上学到很多技术。感谢我的同事姚序明女士,她指导我完成了本书一部分图片的制作。
感谢我的爸爸、妈妈、外公、外婆、爷爷、奶奶、岳父、岳母,感谢你们的支持,并时时刻刻为我灌输着信心和力量。
谨以此书献给我最亲爱的妻子,遇见你是我最大的幸运。
朱鹏程
本书提供如下资源:
● 本书源代码;
● 书中图片文件;
● 本书思维导图;
● 异步社区7天VIP会员。
要获得以上资源,您可以扫描右方二维码,根据指引领取。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见右图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域30余年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。
笔者认为学习一款软件,最好的办法是先搭建一个最小可用系统,然后通过使用该系统快速了解软件的功能和使用场景。如果一上来就学习枯燥的理论知识和概念,则很容易从入门到放弃。Airflow的学习之旅也将秉承这个思路。本章将带领读者一步步快速搭建一个Airflow集群,这个集群可以运行本书中绝大多数的示例代码。
由于本章采用容器化部署的方式来搭建Airflow集群,因此读者需要对容器化技术有一定的了解,包括但不限于Docker、Kubernetes等。如果需要获得Docker的入门知识,可参见附录A。如果需要获得Kubernetes的入门知识,可参见附录B。
在正式开始操作之前,请确保以下依赖已经安装就绪。
● kubectl。kubectl是Kubernetes的命令行工具,用户通过这款工具管理Kubernetes集群。kubectl可以用来部署应用、监测和管理集群资源以及查看日志。
● kind。kind是一款基于Docker构建Kubernetes本地集群的工具,常常用来搭建本地的Kubernetes开发和测试环境。
● Helm。Helm是Kubernetes的包管理器,类似于Ubuntu操作系统中的APT和CentOS中的Yum。Helm支持对Kubernetes应用进行统一打包、分发、安装、升级以及回退。
接下来分别介绍上述3个依赖在Linux、macOS以及Windows 10操作系统中的安装方式。如果你已经非常了解相关内容,可以直接阅读1.2节。
在Linux操作系统中安装kubectl的步骤如下。
步骤1 在Linux操作系统中打开终端,使用下面的命令下载kubectl的v1.24.0版本:
curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
注意
如果想要下载其他版本的kubectl,请将上面命令中的v1.24.0换成相应的版本号。
步骤2 使用下面的命令安装kubectl:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
步骤3 使用下面的命令测试kubectl是否正常工作:
kubectl version --client
如果已经成功安装kubectl,那么上述命令会输出kubectl的版本信息,参考如下:
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:
"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-
03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.4
在macOS中安装kubectl的步骤如下。
步骤1 在macOS中打开终端,使用下面的命令安装kubectl:
brew install kubectl
步骤2 使用下面的命令测试kubectl是否正常工作:
kubectl version --client
如果已经成功安装kubectl,那么上述命令会输出kubectl的版本信息,参考如下:
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:
"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-
03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.4
在Windows 10操作系统中安装kubectl的步骤如下。
步骤1 通过浏览器访问如下地址,下载kubectl的v1.24.0版本:
https://dl.k8s.io/release/v1.24.0/bin/windows/amd64/kubectl.exe
步骤2 在Windows 10操作系统的桌面上右击“此电脑”图标,在弹出的快捷菜单中选择“属性”命令,在“设置”窗口的右侧单击“高级系统设置”,弹出“系统属性”对话框,如图1-1所示。
图1-1 “系统属性”对话框
单击“高级”标签→“环境变量”按钮,弹出“环境变量”对话框,如图1-2所示。
图1-2 “环境变量”对话框
在“用户变量”列表框中选中Path,然后单击“编辑”按钮,此时弹出“编辑环境变量”对话框,再单击“新建”按钮,在文本框中输入步骤1中下载的kubectl.exe文件的目录位置,如图1-3所示。
图1-3 “编辑环境变量”对话框
操作完成后,在“编辑环境变量”对话框、“环境变量”对话框和“系统属性”对话框中依次单击“确定”按钮,保存修改。
注意
本步骤描述的修改PATH环境变量的方法仅在Windows 10操作系统中验证过。对于其他版本的Windows操作系统,方法可能略有不同。
步骤3 打开Windows 10操作系统的命令提示符,输入下面的命令测试kubectl是否正常工作:
kubectl version --client
如果已经成功安装kubectl,那么上述命令会输出kubectl的版本信息,参考如下:
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:
"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-
03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"windows/amd64"}
Kustomize Version: v4.5.4
注意
kubectl的安装方法多种多样。本节介绍了在Linux操作系统和Windows 10操作系统上用二进制文件安装kubectl的方法,以及在macOS上用包管理工具安装kubectl的方法。实际上,在Linux操作系统和Windows 10操作系统上也可以用包管理工具安装kubectl,在macOS上同样能够用二进制文件安装kubectl。建议对这部分内容感兴趣的读者查看Kubernetes官方文档中关于kubectl安装的部分:https://kubernetes.io/docs/tasks/tools/#kubectl。
在安装kind之前,首先安装Docker。
安装Docker的步骤如下。
步骤1 通过浏览器访问下面的地址:
https://docs.docker.com/get-docker/
打开Docker安装包的汇总下载页面,如图1-4所示。
图1-4 Docker安装包的汇总下载页面
该页面包含3个链接,分别指向macOS/Windows/Linux操作系统的Docker安装包下载页面。如果使用的是macOS,请选择Docker Desktop for Mac,进入macOS的Docker安装包下载页面。如果使用的是Windows操作系统,请选择Docker Desktop for Windows,进入Windows操作系统的Docker安装包下载页面。如果使用的是Linux操作系统,请选择Docker Desktop for Linux,进入Linux操作系统的Docker安装包下载页面。每个操作系统的安装包下载页面都包含进一步的引导,用户需要按照提示根据计算机的硬件和操作系统的版本下载符合自己软硬件配置的Docker安装包。
步骤2 使用安装包安装Docker。
如果是macOS,安装包应该是一个dmg文件。双击这个文件,然后把Docker的图标拖曳到Applications目录。
如果是Windows操作系统,安装包应该是一个exe文件。双击运行这个文件即可。
如果是Linux操作系统,根据具体Linux发行版的不同,安装包可能是deb文件或者rpm文件。我们以Ubuntu操作系统为例讲解Docker的安装。Ubuntu是Linux发行版中的一个,Docker安装包在Ubuntu操作系统中是一个deb文件,使用下面的命令安装:
sudo apt-get update
sudo apt-get install ./xxx.deb
其中xxx.deb代表安装包,请根据自己下载的安装包的名称进行替换。
步骤3 初次启动Docker。
从安装的程序中找到Docker Desktop,单击打开。
第一次启动需要按照交互式界面的提示一步步完成设置,具体的过程如下。
(1)在“Docker订阅服务协议”窗口中单击Accept(接受)按钮。
(2)在“安装”窗口中选择Use recommended settings(使用推荐设置)复选框。
(3)单击Finish(完成)按钮。
安装kind的步骤如下。
步骤1 通过浏览器访问下面的地址:
https://github.com/kubernetes-sigs/kind/releases
打开的页面中包含多个kind的发行版,这里选择最新的版本即可。每个版本的kind都会为不同的操作系统提供不同的二进制文件,读者需要根据自己的操作系统选择合适的kind二进制文件。下载完成后,将文件重命名。如果是Linux操作系统和macOS,则将文件重命名为kind。如果是Windows 10操作系统,则将文件重命名为kind.exe。
步骤2 此步骤仅针对Linux操作系统和macOS,使用Windows 10操作系统的用户可以忽略这一步。
打开操作系统终端,输入下面的命令:
chmod +x ./kind
步骤3 对于Linux操作系统和macOS,因为/usr/local/bin目录已经在PATH环境变量中,所以直接把kind二进制文件移动到/usr/local/bin目录下即可,命令如下:
mv ./kind /usr/local/bin/kind
对于Windows 10操作系统,将kind二进制文件的路径追加到PATH环境变量中的方法与1.1.1节在Windows 10操作系统中安装kubectl的步骤3相同,这里不再赘述。
注意
本节并没有罗列kind的全部安装方法。实际上,对于Linux操作系统、macOS、Windows 10操作系统,安装kind的方法有多种。想要尝试不同于本节介绍的安装方法,请阅读kind的官方文档。
安装Helm的步骤如下。
步骤1 通过浏览器访问下面的地址:
https://github.com/helm/helm/releases
打开的页面中包含多个Helm的发行版,这里选择最新的版本即可。每个版本的Helm都会为不同的操作系统提供不同的压缩包文件,读者需要根据自己的操作系统选择合适的Helm压缩包文件。
步骤2 解压缩步骤1中下载的文件,得到一个文件夹,文件夹中包含Helm的二进制文件。如果是Linux操作系统和macOS,文件的名字是helm。如果是Windows 10操作系统,文件的名字是helm.exe。
步骤3 对于Linux操作系统和macOS,因为/usr/local/bin目录已经在PATH环境变量中,所以直接把Helm二进制文件移动到/usr/local/bin目录下即可,命令如下:
mv ./helm /usr/local/bin/helm
对于Windows 10操作系统,将Helm二进制文件的路径追加到PATH环境变量中的方法与1.1.1节在Windows 10操作系统中安装kubectl的步骤3相同,这里不再赘述。
注意
Helm本身提供两种安装方法。同时Helm社区又提供了通过不同的包管理器安装Helm的方法。限于篇幅,本节只介绍Helm的一种安装方法。如果对其他的安装方法感兴趣,推荐查阅Helm官方文档:https://helm.sh/zh/docs/intro/install/。
我们可以利用kind快速搭建一个开发用的Kubernetes集群。具体命令如下:
kind create cluster --image kindest/node:v1.18.15
这一步可能会花费一些时间。下面的命令能帮助确认集群是否已经安装就绪:
kubectl cluster-info --context kind-kind
如果集群安装就绪,那么上述命令会输出类似下面的信息:
Kubernetes control plane is running at https://127.0.0.1:54067
KubeDNS is running at https://127.0.0.1:54067/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
使用Helm部署Airflow集群的步骤如下。
步骤1 使用下面的命令添加Airflow的Helm chart仓库:
helm repo add apache-airflow https://airflow.apache.org
helm repo update
步骤2 使用下面的命令创建Kubernetes的namespace:
kubectl create namespace example-namespace
步骤3 使用下面的命令安装Airflow的Helm chart:
helm install example-release apache-airflow/airflow \
--namespace example-namespace \
--set-string 'env[0].name=AIRFLOW__CORE__LOAD_EXAMPLES,env[0].value=True'
这一步可能会花费一些时间,可以用下面的kubectl命令确认Airflow集群是否已经安装就绪:
kubectl -n example-namespace get po
如果组件都正常工作,上述命令的输出信息如图1-5所示。
图1-5 Airflow所有的组件都正常运行
图1-5显示Airflow所有组件的状态都是Running,这代表一切正常。
另一种确认Airflow集群是否安装就绪的方法是使用Helm命令判断Airflow应用的状态:
helm list --namespace example-namespace
成功安装Airflow应用的标志是命令的输出信息中STATUS一栏为deployed,如图1-6所示。
图1-6 Helm成功安装Airflow应用
步骤4 完成前面的步骤之后能够得到一个正常工作的Airflow集群,但是这个集群无法通过浏览器访问。为了通过浏览器访问集群,使用下面的命令进行端口映射:
kubectl -n example-namespace port-forward svc/example-release-webserver 8080:
8080
接下来打开浏览器,访问http://localhost:8080/,应该能正常载入Airflow Webserver的登录页面,如图1-7所示。
图1-7 Airflow Webserver的登录页面
在Username文本框中输入admin,在Password文本框中输入admin,然后单击Sign In按钮进行登录。成功登录后将进入Airflow Webserver的主页面,如图1-8所示。
图1-8 Airflow Webserver的主页面
至此,Airflow集群构建完毕。接下来我们通过一个示例介绍如何使用Airflow集群。
在图1-8中,我们看到已经有了一些DAG。这些都是Airflow官方提供的示例DAG。因为1.3节在创建集群的时候设置了环境变量AIRFLOW__CORE__LOAD_EXAMPLES为True,所以主页面中显示已经加载了示例DAG。
现在尝试运行第一个示例DAG——example_bash_operator,以此来验证Airflow集群是否可以正常工作。单击DAG左侧的激活按钮来激活这个DAG,如图1-9所示。
图1-9 激活DAG
如果Airflow集群的状态正常,此时example_bash_operator开始运行。一段时间之后可以看到example_bash_operator已经成功运行了一轮,如图1-10所示。
图1-10 成功运行DAG
本章致力于让读者快速拥有一个能够运行本书中绝大多数示例代码的Airflow集群。因为本章介绍的集群中的Airflow组件直接利用了Airflow官方的镜像,所以没有涉及Airflow的安装过程。如果对Airflow的安装感兴趣,请参考第2章的内容。另外,值得注意的是,本章介绍的只是一个功能性集群,建议用来学习Airflow或者用于开发和测试环境。如果需要在生产环境部署Airflow集群,请参考第3章的内容。