Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 创建Google数据流模板文件时出错_Google Cloud Platform_Google Dataflow - Fatal编程技术网

Google cloud platform 创建Google数据流模板文件时出错

Google cloud platform 创建Google数据流模板文件时出错,google-cloud-platform,google-dataflow,Google Cloud Platform,Google Dataflow,我正在尝试使用模板安排一个数据流,该数据流在设定的时间后结束。我可以在使用命令行时成功地做到这一点,但是当我尝试使用Google Cloud Scheduler时,我在创建模板时遇到了一个错误 错误是 文件“pipelin_stream.py”,第37行,在 main() 文件“pipelin_stream.py”,第34行,主目录 结果.取消() 文件“/usr/local/lib/python2.7/dist-packages/apache_-beam/runners/dataflow/d

我正在尝试使用模板安排一个数据流,该数据流在设定的时间后结束。我可以在使用命令行时成功地做到这一点,但是当我尝试使用Google Cloud Scheduler时,我在创建模板时遇到了一个错误

错误是

文件“pipelin_stream.py”,第37行,在
main()
文件“pipelin_stream.py”,第34行,主目录
结果.取消()
文件“/usr/local/lib/python2.7/dist-packages/apache_-beam/runners/dataflow/dataflow_-runner.py”,第1638行,取消
raise IOError('未能获取数据流作业id'。)

IOError:无法获取数据流作业id。
等待时间过后,将由引发错误,该错误似乎是无害的

为了证明这一点,我用Python3.5从我的虚拟机中复制了您的确切问题。模板由
--template\u location
在给定路径中创建,可用于运行作业。请注意,我需要对代码进行一些更改,以使其在数据流中实际工作

如果它对您有任何用处,我最终使用了这个管道代码

从apache_beam.options.pipeline_options导入PipelineOptions
从google.cloud导入pubsub_v1
从google.cloud导入bigquery
将apache_梁作为梁导入
导入日志记录
导入argparse
导入日期时间
#填充此值,以便在默认情况下使用它们
#请注意,BQ中的表需要有名称为message\u body和publish\u time的列名
Table='projectid:datasetid.tableid'
架构='ex1:STRING,ex2:TIMESTAMP'
TOPIC=“项目//topics/”
类AddTimestamps(beam.DoFn):
def进程(self、element、publish_time=beam.DoFn.timestamp参数):
“”“通过提取发布/订阅来处理每个传入元素。”
消息及其发布时间戳放入字典`
默认为发布/订阅服务器返回的发布时间戳
在运行时通过梁绑定到每个元素。
"""
屈服{
“消息体”:解码元素(“utf-8”),
“发布时间”:datetime.datetime.utcfromtimestamp(
浮动(发布时间)
).strftime(“%Y-%m-%d%H:%m:%S.%f”),
}
def干管(argv=无):
parser=argparse.ArgumentParser()
add_参数(“--input_topic”,默认值=topic)
add_参数(“--output_table”,默认值=table)
args,beam_args=parser.parse_known_args(argv)
#save_main_session需要设置为true,因为代码中使用了模块(主要是datetime)
#取消对服务帐户电子邮件的注释以指定自定义服务帐户
p=beam.Pipeline(argv=beam\u args,options=PipelineOptions(save\u main\u session=True,
地区(='us-central1'))#,服务_账户_电子邮件(='email'))
(p
|'ReadData'>>beam.io.ReadFromPubSub(topic=args.input\u topic)。带有\u output\u类型(字节)
|“向消息添加时间戳”>>beam.ParDo(AddTimestamps())
|'WriteToBigQuery'>>beam.io.WriteToBigQuery(args.output\u table,schema=schema,write\u disposition=beam.io.BigQueryDisposition.write\u APPEND)
)
结果=p.运行()
#警告:取消在模板中不能正常工作
结果。等待直到完成(持续时间=3000)
result.cancel()#在一段时间后取消流媒体管道以避免消耗更多资源
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
logger=logging.getLogger().setLevel(logging.INFO)
main()
之后,我运行命令:

#相应地填写
PROJECT=“MYPROJECT-ID”
BUCKET=“MYBUCKET”
模板\u NAME=“试用版”
#创建模板
python3-m templates.template-pubsub-bigquery\
--转轮数据流转轮\
--项目$项目\
--暂存位置gs://$BUCKET/暂存\
--温度位置gs://$BUCKET/temp\
--模板位置gs://$BUCKET/templates/$template\u名称\
--流式
创建管道(这会产生您提到的错误,但仍会创建模板)。 及

#相应地填写工作名称和地面军事系统位置
#如果要使用自己的参数,请取消注释并填充参数
gcloud数据流作业正在运行\
--gcs位置“gs:///dataflow/templates/mytemplate”
#--参数输入_topic=“”,输出_table=“”
运行管道

正如我所说,模板已正确创建,管道工作正常


编辑

实际上,取消功能在模板中不能正常工作。这似乎是一个问题,它需要模板创建时的作业id,当然它不存在,因此它省略了该功能

我发现它可以在管道上提取作业id。我尝试了一些调整,以使其在模板代码本身内工作,但我认为没有必要。如果您想安排它们的执行,我会选择更简单的选项,在特定时间(例如9:01 GMT)执行流媒体管道模板,并使用脚本取消管道

导入日志、re、操作系统
从GoogleAppClient.discovery导入生成
从oauth2client.client导入Google凭据
def retrieve_job_id():
#根据需要填充
项目=“”
作业前缀=“”
位置=“”
logging.info(“在区域{}中查找前缀为{}的作业…”格式(作业前缀,位置))
尝试:
credentials=GoogleCredentials.get_application_default()
数据流=生成('dataflow','v1b3',凭据=凭据)
结果=dataflow.projects().locations().jobs().list(
projectd=项目,
位置=位置,
).execute()
作业\u id=“无”
对于结果中的作业['jobs']:
如果re.findall(r'+re.escape(作业前缀)+'',作业['name']):
job_id=job['id']
打破
logging.info(“作业ID:{}”.format(作业ID))
返回作业id
例外情况除外,如e:
logging.info(“检索作业ID时出错”)
升起钥匙错误(e)
system('gcloud数据流作业取消{}'。格式(retrieve_job_id())
在另一时间(如格林尼治标准时间9:05)。此脚本假定您正在使用相同的作业名称运行脚本