使用 Python 2.7 和 Apache Beam 的 Cloudbuild
Cloudbuild with Python 2.7 and Apache Beam
我在 Python 2.7 上使用 Apache Beam 创建了一个在 Google Dataflow 上运行的管道。当我从我的笔记本电脑在本地部署该管道时,它运行良好。我现在希望通过 CloudBuild 部署它。这是我的 cloudbuild.yaml 文件:
steps:
- name: "docker.io/library/python:2.7"
args: ["pip", "install", "-t", "/workspace/lib", "-r", "requirements.txt"]
- name: "docker.io/library/python:2.7"
args: ["python2", "tests.py"]
env: ["PYTHONPATH=/workspace/lib"]
当触发 CloudBuild 时,它成功安装了所有要求,但是当它尝试在 tests.py 文件中导入 apache_beam 时,我收到以下错误:
File "tests.py", line 3, in <module>
import apache_beam as beam
File "/workspace/lib/apache_beam/__init__.py", line 97, in <module>
from apache_beam import coders
File "/workspace/lib/apache_beam/coders/__init__.py", line 19, in <module>
from apache_beam.coders.coders import *
File "/workspace/lib/apache_beam/coders/coders.py", line 29, in <module>
import google.protobuf.wrappers_pb2
ImportError: No module named google.protobuf.wrappers_pb2
在 requirements.txt 文件中,我有 除其他外 以下内容:
apache-beam==2.16.0
protobuf==3.11.0
注意:requirements.txt 中列出了所有必要的要求,因为我可以在本地部署管道。
我只用另一个名为 tests.py
的文件重现了您的问题:
import apache_beam as beam
在某些社区似乎是known issue。
首先,如果不使用已弃用的 Python2,而是使用 Python3.7,则不会发生此错误。我想虽然 Python2.7 是必需的。
我创建了一个 Dockerfile,例如:
FROM python:2
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./tests.py" ]
然后,更改了 cloudbuild.yaml
:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]
构建成功:
Step 5/6 : COPY . .
---> 082407f9672d
Step 6/6 : CMD [ "python", "./tests.py" ]
---> Running in 7d53e96370f9
Removing intermediate container 7d53e96370f9
---> d60a6d473d21
Successfully built d60a6d473d21
我在 Python 2.7 上使用 Apache Beam 创建了一个在 Google Dataflow 上运行的管道。当我从我的笔记本电脑在本地部署该管道时,它运行良好。我现在希望通过 CloudBuild 部署它。这是我的 cloudbuild.yaml 文件:
steps:
- name: "docker.io/library/python:2.7"
args: ["pip", "install", "-t", "/workspace/lib", "-r", "requirements.txt"]
- name: "docker.io/library/python:2.7"
args: ["python2", "tests.py"]
env: ["PYTHONPATH=/workspace/lib"]
当触发 CloudBuild 时,它成功安装了所有要求,但是当它尝试在 tests.py 文件中导入 apache_beam 时,我收到以下错误:
File "tests.py", line 3, in <module>
import apache_beam as beam
File "/workspace/lib/apache_beam/__init__.py", line 97, in <module>
from apache_beam import coders
File "/workspace/lib/apache_beam/coders/__init__.py", line 19, in <module>
from apache_beam.coders.coders import *
File "/workspace/lib/apache_beam/coders/coders.py", line 29, in <module>
import google.protobuf.wrappers_pb2
ImportError: No module named google.protobuf.wrappers_pb2
在 requirements.txt 文件中,我有 除其他外 以下内容:
apache-beam==2.16.0
protobuf==3.11.0
注意:requirements.txt 中列出了所有必要的要求,因为我可以在本地部署管道。
我只用另一个名为 tests.py
的文件重现了您的问题:
import apache_beam as beam
在某些社区似乎是known issue。
首先,如果不使用已弃用的 Python2,而是使用 Python3.7,则不会发生此错误。我想虽然 Python2.7 是必需的。
我创建了一个 Dockerfile,例如:
FROM python:2
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./tests.py" ]
然后,更改了 cloudbuild.yaml
:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]
构建成功:
Step 5/6 : COPY . .
---> 082407f9672d
Step 6/6 : CMD [ "python", "./tests.py" ]
---> Running in 7d53e96370f9
Removing intermediate container 7d53e96370f9
---> d60a6d473d21
Successfully built d60a6d473d21