首页 > 解决方案 > Cloud Composer 中与 google-cloud-language 的兼容性问题

问题描述

google-cloud-language 1.3.0composer-1.8.3-airflow-1.10.3.

它曾经很好,但从过去两周开始,它报告ImportError: cannot import name 'aio' from 'grpc.experimental'

我已经检查了包的文档,看起来google-cloud-language现在需要grpcio>=1.29.0. 然而,根据 Cloud Composer 版本列表,即使是最新版本的 composer,它的 PyPI 包 grpcio 仍然存在1.23.0

我试图强制其版本升级1.29.0但失败了。

有人可以检查这个问题吗?

标签: google-cloud-composergoogle-cloud-language

解决方案


我能够成功地将grpcio库版本升级到1.31.0. 作为第一步,我建议您将 Cloud Composer 实例升级到最新版本 ( composer-1.11.3-airflow-1.10.9),因为它应该更稳定并解决了一些问题。

要在 Cloud Composer 中安装更新版本的 PyPi 包,您可以按照以下步骤或官方文档

  1. 创建requirements.txt文件并将包名称与版本一起传递:
grpcio>=1.29.0
  1. 执行更新命令并提供 ENVIRONMENT_NAME、新创建文件的完整路径以及 Composer 环境(即 europe-west1)的 LOCATION。
gcloud composer environments update <ENVIRONMENT_NAME> \\
--update-pypi-packages-from-file </PATH/requirements.txt> \\
--location <LOCATION>

我为确认该grpcio版本已从 更改为1.23.0所采取的步骤1.31.0如下:

  1. 通过在 Cloud Shell 中执行以下命令,连接到您的环境的 GKE 集群。您可以在->变量中找到GKE_CLUSTER环境中的值。替换为区域名称:ENVIRONMENT CONFIGURATIONGKE clusterGKE_LOCATION
gcloud container clusters get-credentials ${GKE_CLUSTER} --zone ${GKE_LOCATION}
  1. 连接到 GKE 集群中的工作 POD。NAMESPACE 名称应以: 开头composer-<version>-...,POD_NAME应以airflow-worker-...:开头
kubectl get pods --all-namespaces
kubectl exec -itn <NAMESPACE_NAME> <POD_NAME>  -- /bin/bash
  1. 运行 pip freeze 以查看环境中安装的所有具有相应版本的软件包:
pip freeze
  1. 寻找grpcio==1.31.0包裹。

更新:

当您尝试安装新软件包时,Composer 尝试创建新构建,但失败了,这可以通过在 Stackdriver Logging 中使用以下高级过滤器在 Cloud Build 的日志中看到:

resource.type="build" 

问题是 PyPi 依赖项冲突,每个更新操作都会触发一个重建映像的 Cloud Build 操作。在您使用 Cloud Build 的 Composer 版本中,当看到任何冲突时更新操作失败。在最新版本1.11.3中,您可以选择是否允许冲突。

基于此,我将分享两个建议以避免您遇到的问题:

  • 使用更新的 Composer 版本创建新环境或升级现有环境。在更新的版本 (>=1.10.0) 中,Composer 在版本中使用 pip19.0.2而不是9.0.3. 因此 pip 本身可能会更好地找到依赖关系。
  • 分析 Cloud Build 日志并将包固定到不冲突的版本;然而,这可能相当困难,因为一旦你解决了一个冲突,另一个冲突可能会出现。

推荐阅读