Che*_*rry 7 amazon-web-services aws-glue
应该结束每个作业脚本代码,job.commit()但这个函数的确切操作是什么?
job.commit()调用后执行任何python语句是否安全?PS我没有在PyGlue.zipaws py源代码中找到任何描述:(
小智 10
扩展@yspotts 的答案。job.commit()正如他们提到的,尽管书签只会更新一次,但可以在 AWS Glue 作业脚本中执行多个脚本。然而job.init(),多次拨打电话也是安全的。在这种情况下,书签将使用自上次提交以来处理的 S3 文件正确更新。如果false,则什么也不做。
在该init()函数中,有一个“初始化”标记,该标记被更新并设置为true。然后,在commit()该函数中检查该标记,如果true则执行提交书签并重置“初始化”标记的步骤。
因此,@hoaxz 答案唯一需要改变的是job.init()在 for 循环的每次迭代中调用:
args = getResolvedOptions(sys.argv, [\'TempDir\',\'JOB_NAME\'])\nsc = SparkContext()\nglue_context = GlueContext(sc)\n# Init my job\njob = Job(glue_context)\n\npaths = [\n \'s3://bucket-name/my_partition=apples/\',\n \'s3://bucket-name/my_partition=oranges/\']\n# Read each path individually, operate on them and commit\nfor s3_path in paths:\n job.init(args[\xe2\x80\x98JOB_NAME\xe2\x80\x99], args)\n dynamic_frame = glue_context.create_dynamic_frame_from_options(\n connection_type=\'s3\',\n connection_options={\'paths\'=[s3_path]},\n format=\'json\',\n transformation_ctx="path={}".format(path))\n do_something(dynamic_frame)\n # Commit file read to Job Bookmark\n job.commit()\nRun Code Online (Sandbox Code Playgroud)\n
截至今天,Job对象有用的唯一情况是使用Job Bookmarks时.当您从Amazon S3读取文件时(目前为止仅支持书签的源代码)并调用您的内容job.commit,到目前为止读取的时间和路径将在内部存储,因此如果由于某种原因您再次尝试读取该路径,则只会获得返回未读(新)文件.
在此代码示例中,我尝试分别读取和处理两个不同的路径,并在处理每个路径后提交.如果由于某种原因我停止工作,将不会处理相同的文件.
args = getResolvedOptions(sys.argv, [‘TempDir’,’JOB_NAME’])
sc = SparkContext()
glue_context = GlueContext(sc)
# Init my job
job = Job(glue_context)
job.init(args[‘JOB_NAME’], args)
paths = [
's3://bucket-name/my_partition=apples/',
's3://bucket-name/my_partition=oranges/']
# Read each path individually, operate on them and commit
for path in paths:
try:
dynamic_frame = glue_context.create_dynamic_frame_from_options(
connection_type='s3',
connection_options={'paths'=[s3_path]},
format='json',
transformation_ctx="path={}".format(path))
do_something(dynamic_frame)
# Commit file read to Job Bookmark
job.commit()
except:
# Something failed
Run Code Online (Sandbox Code Playgroud)
Job只有在启用了Job Bookmark的情况下,才能在对象上调用commit方法,并且存储的引用将从JobRun保留到JobRun,直到您重置或暂停Job Bookmark为止.在a之后执行更多python语句是完全安全的Job.commit,并且如前面的代码示例所示,多次提交也是有效的.
希望这可以帮助
小智 5
根据 AWS 支持团队的说法,commit不应多次调用。以下是我从他们那里得到的确切答复:
job.commit() 方法可以被多次调用,并且也不会抛出任何错误。但是,如果在 Glue 脚本中多次调用 job.commit(),则作业书签将在一次作业运行中仅更新一次,即在第一次调用 job.commit() 且其他调用之后job.commit() 将被书签忽略。因此,作业书签可能会陷入循环,并且无法与多个 job.commit() 一起正常工作。因此,我建议您在 Glue 脚本中使用一次 job.commit() 。
| 归档时间: |
|
| 查看次数: |
3531 次 |
| 最近记录: |