首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Python云-数据流实例在没有新部署的情况下中断(失败的pubsub导入)

Google Python云-数据流实例在没有新部署的情况下中断(失败的pubsub导入)
EN

Stack Overflow用户
提问于 2018-06-06 21:21:17
回答 1查看 230关注 0票数 1

我在Google环境中为AppEngine定义了几个不同的云数据流作业。我已经在一个requirements.txt文件中定义了我的需求,包括了我的setup.py文件,而且一切都很正常。我最后一次部署是2018年5月3日。纵观日志,我发现2018年5月22日,我的一份工作开始失败。作业失败,导致堆栈跟踪导致错误导入,如下所示。

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py", line 582, in do_work
    work_executor.execute()
  File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py", line 166, in execute
    op.start()
  File "apache_beam/runners/worker/operations.py", line 294, in apache_beam.runners.worker.operations.DoOperation.start (apache_beam/runners/worker/operations.c:10607)
    def start(self):
  File "apache_beam/runners/worker/operations.py", line 295, in apache_beam.runners.worker.operations.DoOperation.start (apache_beam/runners/worker/operations.c:10501)
    with self.scoped_start_state:
  File "apache_beam/runners/worker/operations.py", line 300, in apache_beam.runners.worker.operations.DoOperation.start (apache_beam/runners/worker/operations.c:9702)
    pickler.loads(self.spec.serialized_fn))
  File "/usr/local/lib/python2.7/dist-packages/apache_beam/internal/pickler.py", line 225, in loads
    return dill.loads(s)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 277, in loads
    return load(file)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 266, in load
    obj = pik.load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 423, in find_class
    return StockUnpickler.find_class(self, module, name)
  File "/usr/lib/python2.7/pickle.py", line 1124, in find_class
    __import__(module)
  File "/usr/local/lib/python2.7/dist-packages/dataflow_pipeline/tally_overages.py", line 27, in <module>
    from google.cloud import pubsub
  File "/usr/local/lib/python2.7/dist-packages/google/cloud/pubsub.py", line 17, in <module>
    from google.cloud.pubsub_v1 import PublisherClient
  File "/usr/local/lib/python2.7/dist-packages/google/cloud/pubsub_v1/__init__.py", line 17, in <module>
    from google.cloud.pubsub_v1 import types
  File "/usr/local/lib/python2.7/dist-packages/google/cloud/pubsub_v1/types.py", line 26, in <module>
    from google.iam.v1.logging import audit_data_pb2
ImportError: No module named logging

因此,主要问题似乎来自于依赖于导入google.iam.v1.logging (从grpc-google-iam-v1安装)的pubsub依赖关系。

这是我的requirements.txt文件

代码语言:javascript
复制
Flask==0.12.2
apache-beam[gcp]==2.1.1
gunicorn==19.7.1
google-cloud-dataflow==2.1.1
google-cloud-datastore==1.3.0
pytz
google-cloud-pubsub
google-gax
grpc-google-iam-v1
googleapis-common-protos
google-cloud==0.32
six==1.10.0
protobuf

通过在我的项目中执行以下操作,我能够在本地运行所有的东西。

代码语言:javascript
复制
$ virtualenv --no-site-packages .
$ . bin/activate
$ pip install --ignore-installed -r requirements.txt
$ python main.py
No handlers could be found for logger "oauth2client.contrib.multistore_file"
INFO:werkzeug: * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
INFO:werkzeug: * Restarting with stat
No handlers could be found for logger "oauth2client.contrib.multistore_file"
WARNING:werkzeug: * Debugger is active!
INFO:werkzeug: * Debugger PIN: 317-820-645

具体来说,我能够在本地完成以下工作

代码语言:javascript
复制
$ python
>>> from google.cloud import pubsub
>>> import google.iam.v1.logging
>>> google.iam.v1.logging.__file__
'/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/iam/v1/logging/__init__.pyc'

因此,我知道grpc-google-iam-v1包的安装在本地运行得很好。所需的文件在那里。

我的问题是

  1. 为什么上的grpc-google-iam-v1安装没有正确安装所有文件?我一定是错过了/site-packages/google/iam/v1/logging目录。
  2. 为什么这会随机开始失败呢?我没有做更多的部署,相同的代码在21日运行和工作,然后在5月22日中断。

在将requirements.txt文件更改为

代码语言:javascript
复制
Flask==0.12.2
apache-beam[gcp]
google-cloud-dataflow
gunicorn==19.7.1
google-cloud-datastore==1.3.0
pytz
google-cloud-pubsub
google-gax
grpc-google-iam-v1
googleapis-common-protos
google-cloud==0.32
six==1.10.0
protobuf

因此,只需从apache-beam[gcp]google-cloud-dataflow中删除版本要求就可以了。

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 19:18:29

约翰·阿拉德提供的解决方案的基础上,来自requirements.txt的删除版本将自动默认为最新版本。因此,如果没有为apache-beam[gcp]google-cloud-dataflowgoogle-cloud-pubsub指定版本,它们都将在最新版本上运行并解决依赖关系问题。requirements.txt将如下所示:

代码语言:javascript
复制
Flask==0.12.2
apache-beam[gcp]
gunicorn==19.7.1
google-cloud-dataflow
google-cloud-datastore==1.3.0
pytz
google-cloud-pubsub
google-gax
grpc-google-iam-v1
googleapis-common-protos
google-cloud==0.32
six==1.10.0
protobuf
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50729803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档