【问题标题】:Google Cloud Dataflow can't import 'google.cloud.datastore'Google Cloud Dataflow 无法导入“google.cloud.datastore”
【发布时间】:2023-03-10 08:29:01
【问题描述】:

这是我的导入代码

from __future__ import absolute_import

import datetime
import json
import logging
import re

import apache_beam as beam
from apache_beam import combiners
from apache_beam.io.gcp.bigquery import parse_table_schema_from_json
from apache_beam.io.gcp.datastore.v1.datastoreio import ReadFromDatastore
from apache_beam.pvalue import AsDict
from apache_beam.pvalue import AsSingleton
from apache_beam.options.pipeline_options import PipelineOptions

from google.cloud.proto.datastore.v1 import query_pb2
from google.cloud import datastore
from googledatastore import helper as datastore_helper, PropertyFilter

# datastore entities that we need to perform the mapping computations
#from models import UserPlan, UploadIntervalCount, RollingMonthlyCount

这就是我的 requirements.txt 文件的样子

$ cat requirements.txt
Flask==0.12.2
apache-beam[gcp]==2.1.1
gunicorn==19.7.1
google-cloud-dataflow==2.1.1
six==1.10.0
google-cloud-datastore==1.3.0
google-cloud

这些都在/lib 目录中。 /lib 目录有以下内容

$ ls -1 lib/google/cloud
__init__.py
_helpers.py
_helpers.pyc
_http.py
_http.pyc
_testing.py
_testing.pyc
bigquery
bigtable
client.py
client.pyc
datastore
dns
environment_vars.py
environment_vars.pyc
error_reporting
exceptions.py
exceptions.pyc
gapic
iam.py
iam.pyc
language
language_v1
language_v1beta2
logging
monitoring
obselete.py
obselete.pyc
operation.py
operation.pyc
proto
pubsub
resource_manager
runtimeconfig
spanner
speech
speech_v1
storage
translate.py
translate.pyc
translate_v2
videointelligence.py
videointelligence.pyc
videointelligence_v1beta1
vision
vision_v1

注意google.cloud.datastoregoogle.cloud.proto 都存在于/lib 文件夹中。但是,此导入行工作正常

from google.cloud.proto.datastore.v1 import query_pb2

但是这个失败了

from google.cloud import datastore

这是个例外(取自google cloud dataflow console online)

(9b49615f4d91c1fb): 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 1133, in load_reduce
    value = func(*args)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 767, in _import_module
    return getattr(__import__(module, None, None, [obj]), obj)
  File "/usr/local/lib/python2.7/dist-packages/dataflow_pipeline/counters_pipeline.py", line 25, in <module>
    from google.cloud import datastore
ImportError: No module named datastore

为什么找不到包裹?

【问题讨论】:

  • 外部依赖必须安装在setup.py并且这个文件应该在管道参数中指定。
  • google.cloud 是外部依赖项吗?它与安装在 /lib 目录中的 google.cloud.proto.v1.datastore 依赖项有何不同,我可以毫无问题地访问?无论如何,我会试一试。我只需要将 google-cloud 添加到 setup.py 内的 REQUIRED_PACKAGES 列表中?
  • 嘿@MarcinZablocki,你的回答是正确的,非常感谢!我仍然很困惑,为什么有些东西可以放在 /lib 目录中并在 appengine_config.py 文件中链接,但其他东西必须在 setup.py 文件中。也许您可以对此进行扩展并将其写为完整的答案?
  • 你看到我的回答了吗?
  • @MarcinZablocki 刚看到,谢谢!

标签: python google-app-engine google-cloud-dataflow


【解决方案1】:

外部依赖必须安装在setup.py,并且这个文件应该在管道参数中指定为--setup_file。 在setup.py 中,您可以使用 custom command

安装您的软件包
pip install google-cloud-datastore==1.3.0

或者通过将你的包添加到REQUIRED_PACKAGES:

REQUIRED_PACKAGES = ["google-cloud-datastore==1.3.0"]

您需要在setup.py 中指定它的原因是因为在DataFlow 执行期间不会使用您在appengine_config 中的库。 App Engine 在这里仅充当调度程序,仅将作业部署到 DataFlow 引擎。然后,DataFlow 会创建一些执行管道的工作机器——这些工作机器不会以任何方式连接到 App Engine。 DataFlow 工作人员必须拥有执行管道所需的每个包,这就是您需要在 setup.py 文件中指定所需包的原因。 DataFlow 工作人员使用此文件来“设置自己”。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多