GCP Composer - 如何 运行 Python 3 而不是 Python 2

GCP Composer - how to run Python 3 instead of Python 2

我正在使用 GCP Composer 编排 ETL…

创建实例时,我将 Python 版本设置为 Python 3

使用 DataFlowPythonOperator 的任务之一,如果从我们的本地 dev-docker 实例启动,它工作正常 (Airflow v1.10.1 + Python 3.6 .9)

它使用 Apache Beam Python 3.6 SDK 2.16.0 如果我 运行 它来自 Docker 图像 运行s 气流 v1.10.1

每当我们部署到 composer-1.7.9-airflow-1.10.1 任务 运行s Python 2.7

如果从 Composer

启动,它也总是 运行 使用 Google Cloud Dataflow SDK 的 Python 2.5.0 的数据流作业

Composer 默认考虑 Python 版本 2.7,这会导致很多转换崩溃……

我找不到配置 Composer 以使用 Python 3.x 创建和 运行 Dataflow 作业的方法...

命令:

$ gcloud composer environments describe etl --location us-central1

结果:

softwareConfig:
    imageVersion: composer-1.7.9-airflow-1.10.1
    pythonVersion: '3'

您的 Composer 环境的 Python 版本与执行 Dataflow 作业的 Python 版本无关。

目前,DataflowPythonOperator 将 Python 版本硬编码为 2。有一个 Pull-Request submitted that fixes this but is yet to be released. You could wait for a release of an Airflow version with the applied fix or you could back-port it as described very detailed in the second part of

另请注意,您必须将 Apache Beam SDK 添加到 Composer 环境的 Python 包中。由于2.16.0是第一个正式支持Python 3的版本,我建议在包列表中指定apache-beam ==2.16.0

至于为什么您可以在本地 Airflow 设置中的 Python 3 中启动作业,我怀疑那里的 python 命令默认为 Python 3。

我遵循了几个步骤解决了这个问题:

  1. 将您的 Composer 实例升级到更高版本。我升级到 composer-1.8.3-airflow-1.10.2(在我写答案的时候)
  2. 您将需要覆盖 DataFlowPythonOperatorDataFlowHook(您可以按照 ) or use this gist repo.
  3. 运行 你的 dag,它应该使用 Python3
  4. 创建一个 Dataflow 作业

Happy coding...