[英]Google Cloud Dataflow Python, Retrieving Job ID
我目前正在使用 Python 编写数据流模板<\/strong>,我想访问作业 ID 并使用它来保存到特定的 Firestore 文档。
是否可以访问作业 ID?
我在文档中找不到任何关于此的内容。
您可以通过在管道中调用dataflow.projects().locations().jobs().list
来实现此目的(请参见下面的完整代码)。 一种可能性是始终使用相同的作业名称调用模板,这很有意义,否则可以将作业前缀作为运行时参数传递。 使用正则表达式解析作业列表,以查看该作业是否包含名称前缀,如果包含名称前缀,则返回该作业ID。 如果有多个,它将仅返回最新的一个(当前正在运行的一个)。
在定义PROJECT
和BUCKET
变量之后,通过以下步骤暂存该模板:
python script.py \
--runner DataflowRunner \
--project $PROJECT \
--staging_location gs://$BUCKET/staging \
--temp_location gs://$BUCKET/temp \
--template_location gs://$BUCKET/templates/retrieve_job_id
然后,在执行模板化作业时指定所需的作业名称(在我的情况下为myjobprefix
):
gcloud dataflow jobs run myjobprefix \
--gcs-location gs://$BUCKET/templates/retrieve_job_id
该retrieve_job_id
功能从作业中返回作业ID,改变job_prefix
匹配给定的名称。
import argparse, logging, re
from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import SetupOptions
def retrieve_job_id(element):
project = 'PROJECT_ID'
job_prefix = "myjobprefix"
location = 'us-central1'
logging.info("Looking for jobs with prefix {} in region {}...".format(job_prefix, location))
try:
credentials = GoogleCredentials.get_application_default()
dataflow = build('dataflow', 'v1b3', credentials=credentials)
result = dataflow.projects().locations().jobs().list(
projectId=project,
location=location,
).execute()
job_id = "none"
for job in result['jobs']:
if re.findall(r'' + re.escape(job_prefix) + '', job['name']):
job_id = job['id']
break
logging.info("Job ID: {}".format(job_id))
return job_id
except Exception as e:
logging.info("Error retrieving Job ID")
raise KeyError(e)
def run(argv=None):
parser = argparse.ArgumentParser()
known_args, pipeline_args = parser.parse_known_args(argv)
pipeline_options = PipelineOptions(pipeline_args)
pipeline_options.view_as(SetupOptions).save_main_session = True
p = beam.Pipeline(options=pipeline_options)
init_data = (p
| 'Start' >> beam.Create(["Init pipeline"])
| 'Retrieve Job ID' >> beam.FlatMap(retrieve_job_id))
p.run()
if __name__ == '__main__':
run()
您可以使用Google Dataflow API 。 使用projects.jobs.list方法检索数据流作业ID。
例如,以下代码段启动存储在 GCS 存储桶中的 Dataflow 模板,从启动模板 API 的响应正文中获取作业 ID,最后每 10 秒轮询一次 Dataflow 作业的最终作业状态。
Google Cloud 的响应正文的官方文档在这里。
到目前为止,我只看到了 Dataflow Job 的六个作业状态,如果我错过了其他的,请告诉我。
def launch_dataflow_template(project_id, location, credentials, template_path):
dataflow = googleapiclient.discovery.build('dataflow', 'v1b3', credentials=credentials)
logger.info(f"Template path: {template_path}")
result = dataflow.projects().locations().templates().launch(
projectId=project_id,
location=location,
body={
...
},
gcsPath=template_path # dataflow template path
).execute()
return result.get('job', {}).get('id')
def poll_dataflow_job_status(project_id, location, credentials, job_id):
dataflow = googleapiclient.discovery.build('dataflow', 'v1b3', credentials=credentials)
# executing states are not the final states of a Dataflow job, they show that the Job is transitioning into another upcoming state
executing_states = ['JOB_STATE_PENDING', 'JOB_STATE_RUNNING', 'JOB_STATE_CANCELLING']
# final states do not change further
final_states = ['JOB_STATE_DONE', 'JOB_STATE_FAILED', 'JOB_STATE_CANCELLED']
while True:
job_desc =_get_dataflow_job_status(dataflow, project_id, location, job_id)
if job_desc['currentState'] in executing_states:
pass
elif job_desc['currentState'] in final_states:
break
sleep(10)
return job_id, job_desc['currentState']
您可以通过在 2.35.0 中使用这些光束函数来获取 gcp 元数据。 您可以访问文档https://beam.apache.org/releases/pydoc/2.35.0/_modules/apache_beam/io/gcp/gce_metadata_util.html#fetch_dataflow_job_id
beam.io.gcp.gce_metadata_util._fetch_custom_gce_metadata("job_name")
beam.io.gcp.gce_metadata_util._fetch_custom_gce_metadata("job_id")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.