すべてのジョブスクリプトコードはjob.commit()
で終了する必要がありますが、この関数はどのような正確なアクションを実行しますか?
job.commit()
が呼び出された後、pythonステートメントを実行しても安全ですか?P.S。PyGlue.Zip
にawspyソースコードの説明が見つかりません:(
現在のところ、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ステートメントを実行することは完全に安全であり、前のコードサンプルに示されているように、複数回コミットすることも有効です。
お役に立てれば
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.
@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()