job.com在aws胶水中执行了哪些操作?

Che*_*rry 7 amazon-web-services aws-glue

应该结束每个作业脚本代码,job.commit()但这个函数的确切操作是什么?

  1. 它只是工作结束标记吗?
  2. 可以在一个工作期间调用两次(如果是 - 在什么情况下)?
  3. job.commit()调用后执行任何python语句是否安全?

PS我没有在PyGlue.zipaws py源代码中找到任何描述:(

小智 10

扩展@yspotts 的答案。job.commit()正如他们提到的,尽管书签只会更新一次,但可以在 AWS Glue 作业脚本中执行多个脚本。然而job.init(),多次拨打电话也是安全的。在这种情况下,书签将使用自上次提交以来处理的 S3 文件正确更新。如果false,则什么也不做。

\n

在该init()函数中,有一个“初始化”标记,该标记被更新并设置为true。然后,在commit()该函数中检查该标记,如果true则执行提交书签并重置“初始化”标记的步骤。

\n

因此,@hoaxz 答案唯一需要改变的是job.init()在 for 循环的每次迭代中调用:

\n
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()\n
Run Code Online (Sandbox Code Playgroud)\n


hoa*_*axz 7

截至今天,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() 。