Python 从GCP的PubSub works读取数据流,can';不要在本地运行

Python 从GCP的PubSub works读取数据流,can';不要在本地运行,python,google-cloud-platform,google-cloud-dataflow,apache-beam,Python,Google Cloud Platform,Google Cloud Dataflow,Apache Beam,我有一个小的测试数据流作业,它只是从PubSub订阅中读取并丢弃消息,我们使用它来开始一些概念验证工作 它在GCP上运行正常,但在本地失败。我的期望是,相同的代码应该以任何一种方式工作,只需切换数据流运行程序,但可能不是这样?代码如下: import os from datetime import datetime import logging from apache_beam import Map, io, Pipeline from apache_beam.options.pipeline

我有一个小的测试数据流作业,它只是从PubSub订阅中读取并丢弃消息,我们使用它来开始一些概念验证工作

它在GCP上运行正常,但在本地失败。我的期望是,相同的代码应该以任何一种方式工作,只需切换数据流运行程序,但可能不是这样?代码如下:

import os
from datetime import datetime
import logging

from apache_beam import Map, io, Pipeline
from apache_beam.options.pipeline_options import PipelineOptions

def noop(element):
    pass

def run(input_subscription, pipeline_args=None):
    pipeline_options = PipelineOptions(
        pipeline_args, streaming=True, save_main_session=True
    )

    with Pipeline(options=pipeline_options) as pipeline:
        (
            pipeline
            | "Read from Pub/Sub" >> io.ReadFromPubSub(subscription=input_subscription, with_attributes=True)
            | "noop" >> Map(noop)
        )


if __name__ == "__main__":
    logging.getLogger().setLevel(logging.INFO)

    run(
        os.environ['INPUT_SUBSCRIPTION'],
        [
            '--runner', os.getenv('RUNNER', 'DirectRunner'),
            '--project', os.getenv('PROJECT'),
            '--region', os.getenv('REGION'),
            '--temp_location', os.getenv('TEMP_LOCATION'),
            '--service_account_email', os.getenv('SERVICE_ACCOUNT_EMAIL'),
            '--network', os.getenv('NETWORK'),
            '--subnetwork', os.getenv('SUBNETWORK'),
            '--num_workers', os.getenv('NUM_WORKERS'),
        ]
    )

如果我用这个命令行运行它,它会在Google云中创建并运行作业,效果很好:

INPUT_SUBSCRIPTION=subscriptionname \
RUNNER=DataflowRunner \
PROJECT=project \
REGION=region \
TEMP_LOCATION=gs://somewhere/temp \
SERVICE_ACCOUNT_EMAIL=serviceaccount@project.iam.gserviceaccount.com \
NETWORK=network \
SUBNETWORK=https://www.googleapis.com/compute/v1/projects/project/regions/region/subnetworks/subnetwork \
NUM_WORKERS=3 \
python read-pubsub-with-dataflow.py
如果我省略了
RUNNER
选项,那么它将使用
DirectRunner

INPUT_SUBSCRIPTION=subscriptionname \
PROJECT=project \
REGION=region \
TEMP_LOCATION=gs://somewhere/temp \
SERVICE_ACCOUNT_EMAIL=serviceaccount@project.iam.gserviceaccount.com \
NETWORK=network \
SUBNETWORK=https://www.googleapis.com/compute/v1/projects/project/regions/region/subnetworks/subnetwork \
NUM_WORKERS=3 \
python read-pubsub-with-dataflow.py
它失败了,出现了大量错误消息,但我将只包括第一条(我认为其余的只是级联):

INFO:apache\u beam.runner.direct.direct\u runner:使用DirectRunner运行管道。
/Users/denis/redact/env/lib/python3.6/site packages/google/auth/_default.py:70:UserWarning:您的应用程序已使用来自google Cloud SDK的最终用户凭据进行身份验证,但没有配额项目。您可能会收到“超出配额”或“API未启用”错误。我们建议您重新运行“gcloud auth application default login”,并确保添加了配额项目。或者您可以使用服务帐户。有关服务帐户的详细信息,请参阅https://cloud.google.com/docs/authentication/
警告。警告(\u云\u SDK\u凭据\u警告)
错误:apache_beam.runners.direct.executor:由于异常,包中出现异常。
回溯(最近一次呼叫最后一次):
文件“/Users/denis/redacted/env/lib/python3.6/site packages/apache_beam/runners/direct/transform_evaluator.py”,第694行,在pubsub的_read_中
self.\u sub\u name,max\u messages=10,return\u instally=True)
文件“/Users/denis/redact/env/lib/python3.6/site packages/google/cloud/pubsub_v1/_gapic.py”,第40行,在
fx=lambda self,*a,**kw:wrapped_fx(self.api,*a,**kw)35;noqa
文件“/Users/denis/redact/env/lib/python3.6/site packages/google/pubsub_v1/services/subscriber/client.py”,第1106行,拉入
如果设置了'request'参数,则
ValueError:如果设置了'request'参数,则不应设置任何单个字段参数。
在处理上述异常期间,发生了另一个异常:
等

我怀疑这可能和证件有关?还是我们的项目配置?也许我应该尝试一个新的空白项目。

这是不兼容的软件包版本。我的
requirements.txt
是:

apache_beam[gcp]
google_apitools
google-cloud-pubsub
但那是安装了一个版本的
googlecloudpubsub
软件包,它正在破坏
apache_beam
。我将我的
requirements.txt
更改为:

apache_beam[gcp]
google_apitools
现在一切都好了

值得一提的是,使用
DirectRunner
在本地运行,我显然不需要
DataflowRunner
所需的很多选项。这就足够了:

GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json \
RUNNER=DirectRunner \
INPUT_SUBSCRIPTION=projects/mytopic/subscriptions/mysubscription \
python read-pubsub-with-dataflow.py

错误说明了一切,它与凭据以及管道如何使用GCP进行身份验证有关。我建议您改为使用服务帐户,并为该服务帐户授予所需的所有权限。
GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json \
RUNNER=DirectRunner \
INPUT_SUBSCRIPTION=projects/mytopic/subscriptions/mysubscription \
python read-pubsub-with-dataflow.py