web-dev-qa-db-ja.com

job.commitはawsglueでどのようなアクションを実行しますか?

すべてのジョブスクリプトコードはjob.commit()で終了する必要がありますが、この関数はどのような正確なアクションを実行しますか?

  1. それは単なる仕事の終わりのマーカーですか?
  2. 1つのジョブ中に2回呼び出すことはできますか(はいの場合-どのような場合)?
  3. job.commit()が呼び出された後、pythonステートメントを実行しても安全ですか?

P.S。PyGlue.Zipにawspyソースコードの説明が見つかりません:(

7
Cherry

現在のところ、Jobオブジェクトが役立つのは、JobBookmarksを使用する場合だけです。 Amazon S3( これまでにサポートされているブックマークのソースのみ )からファイルを読み取り、job.commitを呼び出すと、これまでに読み取られた時間とパスが内部に保存されるため、何らかの理由でそのパスを再度読み取ろうとすると、未読の(新しい)ファイルのみが返されます。

このコードサンプルでは、​​2つの異なるパスを別々に読み取って処理し、各パスが処理された後にコミットしようとしています。なんらかの理由でジョブを停止すると、同じファイルが処理されません。

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

Jobオブジェクトでcommitメソッドを呼び出すことは、ジョブブックマークが有効になっている場合にのみ機能し、ジョブブックマークをリセットまたは一時停止するまで、保存された参照はJobRunからJobRunに保持されます。 Job.commitの後にさらにpythonステートメントを実行することは完全に安全であり、前のコードサンプルに示されているように、複数回コミットすることも有効です。

お役に立てれば

7
hoaxz

AWSサポートチームによると、commitは複数回呼び出されるべきではありません。これが私が彼らから得た正確な応答です:

The method job.commit() can be called multiple times and it would not throw any error 
as well. However, if job.commit() would be called multiple times in a Glue script 
then job bookmark will be updated only once in a single job run that would be after 
the first time when job.commit() gets called and the other calls for job.commit() 
would be ignored by the bookmark. Hence, job bookmark may get stuck in a loop and 
would not able to work well with multiple job.commit(). Thus, I would recommend you 
to use job.commit() once in the Glue script.
1
yspotts

@yspottsの回答を拡張します。 AWS GlueJobスクリプトで複数のjob.commit()を実行することは可能ですが、ブックマークは1回だけ更新されます。 ただしjob.init()を複数回呼び出すことも安全です。この場合、ブックマークは前回のコミット以降に処理されたS3ファイルで正しく更新されます。 falseの場合、何もしません。

init()関数には、更新されてtrueに設定される「初期化された」マーカーがあります。次に、commit()関数でこのマーカーがチェックされ、trueの場合、ブックマークをコミットして「初期化された」マーカーをリセットする手順が実行されます。

したがって、@ hoaxzの回答から変更する唯一のことは、forループのすべての反復でjob.init()を呼び出すことです。

args = getResolvedOptions(sys.argv, [‘TempDir’,’JOB_NAME’])
sc = SparkContext()
glue_context = GlueContext(sc)
# Init my job
job = Job(glue_context)

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:
    job.init(args[‘JOB_NAME’], args)
    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()
0
nanodgb