Apache Airflow 1.10.9 升级到 2.0.2 版本实践

五一放假回来在我们测试环境对Airflow进行了升级实验,总结出来了这篇文章,供还在使用Airflow1.10版本的各位朋友参考.

强烈建议各位使用Airflow的朋友升级到2.0.x版本,实践效果杠杠的.

0.注意事项:

a.升级之前要备份!要备份!备份!

b.升级过程中的操作要进行记录,积累实践的经验,避免重复犯错.

1.整体升级流程列表

a.查看Upgrading to 2.x 及 Updating.md文档

b.现有Airflow情况梳理

c.升级到1.10.15 桥接版本

d.使用Upgrade check 脚本检测需要修改的部分并按照提示修改

e.升级到2.0.2版本

f.检查2.0.2版本的功能是否和1.10.x版本的功能一致

g.将mysql替换成pg(可选项)

2.查看 Upgrading to Airflow 2.0+ 及 Updating.md文档

可以从 Upgrading to Airflow 2.0+ (https://airflow.apache.org/docs/apache-airflow/stable/upgrading-to-2.html#) 文档中看到,建议的升级步骤有 7 大步骤,分别为:

Step 1: 升级到 Python 3

Airflow 2.0+ 只支持Python 3了,若需升级Airflow则需要先升级Python

Step 2: 升级到 Airflow 1.10.15 (a.k.a 桥接版本)

为了避免用户之间升级到2.0版本出现意外,Airflow社区特别的release了1.10.15版本作为桥接版本,让用户先在1.10.15版本进行可向下兼容的升级,校验过后再升级到2.0版本.

Step 3: 安装及运行 升级检查 (Upgrade Check) 脚本

这个脚本会检查airflow.cfg中的所有配置及用户所有的DAG文件,然后给出一个详细的为了升级到2.0版本而作的修改的报告。用户参照着这个报告进行相应的修改即可.

Step 4: 从 Backport Providers中引入 Operators

引入Backport Providers可以提前的对operators 的包路径进行修改,从而兼容到 2.0版本.

Step 5: 升级 Airflow DAGs

2.0版本的语法有些变化,需要参考文档进行修改.

Step 6: 升级配置文件

2.0版本的参数配置有些变化,需要参考文档进行修改.

Step 7: 升级到 Airflow 2.0

在进行了DAGs 及 airflow.cfg 的修改之后,且在 Upgrade Check 脚本校验确认OK了之后可以运行命令升级到Airflow2.0版本

在最后还包括了FAQ及Appendix内容。

Upgrading to Airflow 2.0+ 文档内容非常齐全,需要在预备升级前查看。

从Updating.md (https://github.com/apache/airflow/blob/2.0.2/UPDATING.md)文档中,可以看到各个版本中的一些特性的变化,在后面遇到问题的时候可以查一查,可以找到具体在哪个版本变更的,并有针对性的进行修改。

3.现有Airflow情况梳理

a.软件版本:

airflow version : 1.10.9

python version : 3.7.7

broker : redis 5.0.4

metadata backend: mysql 5.7.27

b.安装部署拓扑结构

对梳理1.10.9版本的 airflow拓扑结构,以便后续代码升级,软件升级等操作.

c.列举使用到的plugins\operators\hooks\工具代码等等

使用到的插件: ...

自定义的operator/hook: ...

使用到的第三方opertors/hook:  ...

自定义的工具代码: ...

4.升级到1.10.15 桥接版本

下面,我们先将Airflow升级到 1.10.15版本

-- 升级到1.10.15 版本的 airflow 的相关命令
AIRFLOW_VERSION=1.10.15
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
pip install "apache-airflow==${AIRFLOW_VERSION}" --upgrade --constraint "${CONSTRAINT_URL}"

-- 运行 airflow db upgrade 命令 (注意 1.10.15 版本的命令已经和 2.0 的一致了 之前的 airflow upgradedb 已经 不能用了)

airflow db upgrade

然后重启airflow 即可升级到 1.10.15 版本,在airflow web ui 上可以验证功能是否正常 若有问题的话,需要查看 ${AIRFLOW_HOME} 目录下的日志,通过日志定位具体原因针对性的解决注意: 1.10.15 版本的 airflow worker 命令不能用了,需要 使用 airflow celery worker 命令

5.使用Upgrade check 脚本检测需要修改的部分并按照提示修改

-- 安装 upgrade check 程序
pip install apache-airflow-upgrade-check

-- 运行 Airflow Upgrade Check程序
airflow upgrade_check

-- 运行过程中会打出相关的报告日志 如:
============================================== STATUS ============================================

Check for latest versions of apache-airflow and checker..................................SUCCESS
Remove airflow.AirflowMacroPlugin class..................................................SUCCESS
Chain between DAG and operator not allowed...............................................SUCCESS
Connection.conn_id is not unique.........................................................SUCCESS
Connection.conn_type is not nullable.....................................................SUCCESS
Fernet is enabled by default.............................................................FAIL
GCP service account key deprecation......................................................SUCCESS
Changes in import paths of hooks, operators, sensors and others..........................FAIL
Users must delete deprecated configs for KubernetesExecutor..............................FAIL
Legacy UI is deprecated by default.......................................................SUCCESS
Logging configuration has been moved to new section......................................FAIL
Removal of Mesos Executor................................................................SUCCESS
Users must set a kubernetes.pod_template_file value......................................FAIL
SendGrid email uses old airflow.contrib module...........................................SUCCESS
Changes in import path of remote task handlers...........................................SUCCESS
Jinja Template Variables cannot be undefined.............................................FAIL
Found 7 problems.

========================================== RECOMMENDATIONS ========================================

Fernet is enabled by default
----------------------------
The fernet mechanism is enabled by default to increase the security of the default installation.

Problems:

1.  fernet_key in airflow.cfg must be explicitly set empty as fernet mechanism is enabledby default. This means that the apache-airflow[crypto] extra-packages are always installed.However, this requires that your operating system has libffi-dev installed.

Changes in import paths of hooks, operators, sensors and others
---------------------------------------------------------------
Many hooks, operators and other classes has been renamed and moved. Those changes were part of unifying names and imports paths as described in AIP-21.
The contrib folder has been replaced by providers directory and packages:
<https://github.com/apache/airflow#backport-packages>

Problems:

1.  Using ``airflow.operators.python_operator.PythonOperator`` will be replaced by ``airflow.operators.python.PythonOperator``. Affected file:

检查项中出现Fail,则需要根据提示进行修改。

在运行过程中报了一个错误,使得整个流程无法向下运行

AttributeError: 'AppBuilderGitlabView' object has no attribute 'datamodel'

这个是使用Airflow Gitlab Webhook插件导致的问题,根据提示,找到具体的出错的代码,发现是代码有个bug,展示注释掉一段代码,跳过这个检查。 也可以根据 Upgrade Check文章推荐的,使用 配置文件关闭这项的检查

airflow upgrade_check --config=./upgrade-configuration.yaml

再按照提示的 安装相关的 back-port-providers 如:

pip install apache-airflow-backport-providers-apache-hive
pip install apache-airflow-backport-providers-apache-spark
pip install apache-airflow-backport-providers-mysql

然后可以拿一个 之前已经存在的DAG文件进行修改并进行验证.

验证OK的话,DAG能够正常运行的话,说明改动是OK的,可以批量的进行替换.若出现问题则需要根据提示/日志进行定位并解决.

对于提示的deprecated 的配置参数也要参照文档进行相应修改.

6.升级到2.0.2版本

-- 升级到2.0.2 版本的 airflow 的命令
AIRFLOW_VERSION=2.0.2
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL="<https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt>"
pip install "apache-airflow==${AIRFLOW_VERSION}" --upgrade --constraint "${CONSTRAINT_URL}"

-- 运行 airflow db upgrade 命令 
airflow db upgrade

-- 运行的过程中报了一个错误
1071 - Specified key was too long; max key length is 1000 bytes

-- 在airflow 的mysql 库中运行以下命令得以解决
SET @@global.innodb_large_prefix = 1;

-- 解决完这个问题后再次升级db
airflow db upgrade

7.检验2.0.2版本的功能是否和1.10.x版本的功能一致

运行若干DAG,查看效果是否OK

我在验证过程中碰到了在dag import 过程中 PythonSensor报错的问题:
Invalid arguments were passed to PythonSensor (task_id: check_sensor). Invalid arguments were: **kwargs: {'provide_context': True}

通过查看Updating.md文件,可以看到 在 2.0版本中 已经移除了 provide_context 这个参数,所有不能再传参了,但是在Updating.md中说可以向后兼容的,然后我继续的查找了下源码,发现有一个参数可以进行控制,在配置文件中设置为True,重启所有节点发现import错误都消失了。

https://github.com/apache/airflow/blob/2.0.2/airflow/models/baseoperator.py#L411

 

在airflow.cfg中的 [operators] 模块下添加 allow_illegal_arguments = True

依次对含有不同Operators的DAG进行功能验证,确认是否都OK.

8.Airflow2.0.2 问题及解决方案

9.总结及展望

升级的过程中需要仔细的阅读官方文档,做好充足的准备工作,升级的过程中,遇到了问题需要参照文档\日志\源码进行定位并解决,若无法直接定位到问题,则需要通过Google进行搜索,查找相关问题的的线索,并进行试探性的解决。

大家快去升级吧!

 

更多关于Apache Airflow的文章,请查看 Apache Airflow系列文章

欢迎加入Apache Airflow 技术交流群,共同玩转Airflow.

或者加入QQ群 704721809。

参考资料:

[1] #1071 - Specified key was too long; max key length is 1000 bytes

https://stackoverflow.com/questions/8746207/1071-specified-key-was-too-long-max-key-length-is-1000-bytes

[2] Apache Airflow Upgrade Check Script

https://airflow.apache.org/docs/apache-airflow/stable/upgrade-check.html

[3] migrate from mysql to postgresql

https://einverne.github.io/post/2019/09/migrate-from-mysql-to-postgresql.html

[4] Celery Result-backend Database-url-examples

https://docs.celeryproject.org/en/latest/userguide/configuration.html#database-url-examples

[5] dockerhub postgres page

https://hub.docker.com/_/postgres

[6] pgloader issue

https://github.com/dimitri/pgloader/issues/327#issuecomment-209533946

[7] psycopg2-extensions install

https://stackoverflow.com/questions/12728004/error-no-module-named-psycopg2-extensions

[8] dive into airflow scheduler

https://blog.kk17.net/post/diving-into-airflow-scheduler/

[9] Airflow psycopg2.OperationalError: FATAL: sorry, too many clients already

https://stackoverflow.com/questions/51487740/airflow-psycopg2-operationalerror-fatal-sorry-too-many-clients-already

[10] How to increase the max connections in postgres?

https://stackoverflow.com/questions/30778015/how-to-increase-the-max-connections-in-postgres

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Apache Airflow是一个开源的工作流程管理平台,用于将任务以有序的方式进行调度和执行。实战Apache Airflow可以帮助我们更好地管理和监控数据流和任务的运行。 首先,我们可以使用Apache Airflow创建和定义任务的工作流程。通过编写代码,我们可以定义任务之间的依赖关系并设置任务的调度时间。这使得我们能够更好地组织和安排任务的执行顺序,以确保任务按照我们期望的方式进行。 其次,Apache Airflow提供了一个直观的用户界面,通过该界面我们可以轻松地查看和监控任务的运行情况。我们可以查看任务的调度时间、执行结果和任务之间的依赖关系,以及任务的日志记录。这样,我们可以即时获取任务执行的状态和进展,及时发现并解决问题。 此外,Apache Airflow还提供了一种灵活的方式来处理任务失败和重试。我们可以配置任务的重试次数和重试间隔,在任务失败时自动进行重试,以确保任务最终成功完成。这大大提高了任务的容错性和稳定性。 最后,Apache Airflow还提供了丰富的插件和扩展性,可以与其他工具和服务进行集成。我们可以通过插件来连接和操作不同的数据源,例如数据库、文件系统或云存储。这使得我们能够更方便地进行数据处理和分析,提高工作效率。 总而言之,Apache Airflow是一个功能强大的工作流程管理平台,可以帮助我们更好地组织、调度和监控任务的执行。通过实战Apache Airflow,我们可以提高任务的可靠性和效率,以及更好地处理和分析数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值