Python 从GCP的PubSub works读取数据流,can';不要在本地运行
我有一个小的测试数据流作业,它只是从PubSub订阅中读取并丢弃消息,我们使用它来开始一些概念验证工作 它在GCP上运行正常,但在本地失败。我的期望是,相同的代码应该以任何一种方式工作,只需切换数据流运行程序,但可能不是这样?代码如下: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
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