AWS Glue书签

时间:2018-12-11 14:57:27

标签: amazon-web-services pyspark parquet aws-glue

如何验证我的书签正常工作?我发现当我在完成之前的工作后立即进行工作时,似乎仍然需要很长时间。这是为什么?我以为它不会读取已经处理过的文件?该脚本如下所示:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

inputGDF = glueContext.create_dynamic_frame_from_options(connection_type = "s3", connection_options = {"paths": ["s3://xxx-glue/testing-csv"], "recurse": True}, format = "csv", format_options = {"withHeader": True}, transformation_ctx="inputGDF")

if bool(inputGDF.toDF().head(1)):
    print("Writing ...")
    inputGDF.toDF() \
      .drop("createdat") \
      .drop("updatedat") \
      .write \
      .mode("append") \
      .partitionBy(["querydestinationplace", "querydatetime"]) \
      .parquet("s3://xxx-glue/testing-parquet")
else:
    print("Nothing to write ...")

job.commit()

import boto3
glue_client = boto3.client('glue', region_name='ap-southeast-1')
glue_client.start_crawler(Name='xxx-testing-partitioned')

外观如下:

18/12/11 14:49:03 INFO Client: Application report for application_1544537674695_0001 (state: RUNNING)
18/12/11 14:49:03 DEBUG Client: 
client token: N/A
diagnostics: N/A
ApplicationMaster host: 172.31.2.72
ApplicationMaster RPC port: 0
queue: default
start time: 1544539297014
final status: UNDEFINED
tracking URL: http://ip-172-31-0-204.ap-southeast-1.compute.internal:20888/proxy/application_1544537674695_0001/
user: root
18/12/11 14:49:04 INFO Client: Application report for application_1544537674695_0001 (state: RUNNING)
18/12/11 14:49:04 DEBUG Client: 
client token: N/A
diagnostics: N/A
ApplicationMaster host: 172.31.2.72
ApplicationMaster RPC port: 0
queue: default
start time: 1544539297014
final status: UNDEFINED
tracking URL: http://ip-172-31-0-204.ap-southeast-1.compute.internal:20888/proxy/application_1544537674695_0001/
user: root
18/12/11 14:49:05 INFO Client: Application report for application_1544537674695_0001 (state: RUNNING)
18/12/11 14:49:05 DEBUG Client: 
client token: N/A
diagnostics: N/A
ApplicationMaster host: 172.31.2.72
ApplicationMaster RPC port: 0
queue: default
start time: 1544539297014
final status: UNDEFINED
tracking URL: http://ip-172-31-0-204.ap-southeast-1.compute.internal:20888/proxy/application_1544537674695_0001/
user: root
...

18/12/11 14:42:00 INFO NewHadoopRDD: Input split: s3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-15_2018-11-19.csv:0+1194081
18/12/11 14:42:00 INFO S3NativeFileSystem: Opening 's3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-14_2018-11-18.csv' for reading
18/12/11 14:42:00 INFO S3NativeFileSystem: Opening 's3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-15_2018-11-19.csv' for reading
18/12/11 14:42:00 INFO Executor: Finished task 89.0 in stage 0.0 (TID 89). 2088 bytes result sent to driver
18/12/11 14:42:00 INFO CoarseGrainedExecutorBackend: Got assigned task 92
18/12/11 14:42:00 INFO Executor: Running task 92.0 in stage 0.0 (TID 92)
18/12/11 14:42:00 INFO NewHadoopRDD: Input split: s3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-16_2018-11-20.csv:0+1137753
18/12/11 14:42:00 INFO Executor: Finished task 88.0 in stage 0.0 (TID 88). 2088 bytes result sent to driver
18/12/11 14:42:00 INFO CoarseGrainedExecutorBackend: Got assigned task 93
18/12/11 14:42:00 INFO Executor: Running task 93.0 in stage 0.0 (TID 93)
18/12/11 14:42:00 INFO NewHadoopRDD: Input split: s3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-17_2018-11-21.csv:0+1346626
18/12/11 14:42:00 INFO S3NativeFileSystem: Opening 's3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-16_2018-11-20.csv' for reading
18/12/11 14:42:00 INFO S3NativeFileSystem: Opening 's3://pinfare-glue/testing-csv/2018-09-25/DPS/2018-11-17_2018-11-21.csv' for reading
18/12/11 14:42:00 INFO Executor: Finished task 90.0 in stage 0.0 (TID 90). 2088 bytes result sent to driver
18/12/11 14:42:00 INFO Executor: Finished task 91.0 in stage 0.0 (TID 91). 2088 bytes result sent to driver
18/12/11 14:42:00 INFO CoarseGrainedExecutorBackend: Got assigned task 94
18/12/11 14:42:00 INFO CoarseGrainedExecutorBackend: Got assigned task 95
18/12/11 14:42:00 INFO Executor: Running task 95.0 in stage 0.0 (TID 95)
18/12/11 14:42:00 INFO Executor: Running task 94.0 in stage 0.0 (TID 94)

...我注意到镶木地板上附加了大量重复数据...书签不起作用吗?它已经启用

5 个答案:

答案 0 :(得分:3)

书签要求

来自the docs

  1. 作业必须使用--job-bookmark-option job-bookmark-enable创建(或者如果使用控制台,则在控制台选项中)。职位还必须有一个职位名称;这将自动传递。

  2. 工作必须以Job.Init(jobname)开始 例如

job = Job(glueContext)
job.init(args['JOB_NAME'], args)
  1. 作业必须具有Job.Commit()才能保存书签的状态并成功完成。

  2. 数据源必须是s3源或JDBC(有限的,不是您的用例,因此我将忽略它)。

    example in the docs显示使用表名而不是显式S3路径从(胶水/湖形成)目录创建动态帧。这意味着从目录中读取内容仍被视为S3来源;基础文件将在S3上。

  3. s3上的文件必须为JSON,CSV,Apache Avro,0.9和更高版本的XML之一,或者可以为1.0和更高版本的Parquet或ORC

  4. 脚本中的数据源必须具有transformation_ctx参数。
    文档说

  

仅将 transformation_ctx 参数传递给您所使用的那些方法   想要启用书签   您可以将其添加到每个转换中以保存状态,但关键的是您要添加书签的数据源。

问题排查

来自the docs

  • 最大并行度必须为1。更高的值会破坏书签
  • 它还提到job.comit()并如上所述使用transformation_ctx
  

对于Amazon S3输入源,工作书签检查最后修改   对象的时间(而不是文件名)来验证哪个   对象需要重新处理。如果您的输入源数据是   自上次作业运行以来已被修改,则当您重新处理文件时   再次运行作业。

其他要检查的东西

  • 您是否已验证路径"s3://xxx-glue/testing-csv"中的CSV文件尚未包含重复项?您可以使用Glue搜寻器或在Athena中编写DDL在其上创建表并直接查看。或者,创建一个dev端点并运行一个齐柏林飞艇或sagemaker笔记本并逐步执行代码。

  • 在任何地方都没有提到编辑脚本会重置状态,但是,如果您修改了数据源的transformation_ctx或其他阶段,则可能会影响状态,但是我还没有t证实了这一点。作业有一个Jobname,用于键控状态,以及用于管理重试的运行号,尝试号和版本号以及最新状态,这意味着对脚本的微小更改不会影响该状态。只要Jobname是一致的,但是我没有再次验证。

  • 顺便说一句,在代码中测试inputGDF.toDF().head(1),然后运行inputGDF.toDF()...写入数据。 Spark的计算是延迟的,但在这种情况下,您要对数据帧运行等效的动态帧两次,而spark无法缓存或重用它。最好在df = inputGDF.toDF()之前做类似if的事情,然后再重复使用df两次。

答案 1 :(得分:1)

答案 2 :(得分:0)

仅作记录,因为尚未找到答案。

我认为编辑脚本似乎会影响书签……但是我认为应该不会……

答案 3 :(得分:0)

请查看this文档,了解有关AWS Glue书签机制的信息。

基本上,它需要通过控制台(或CloudFormation)启用它,并指定SELECT A.ID,A.Color, group_contact(B.NAME) FROM A LEFT JOIN B ON FIND_IN_SET(A.IDDOCT, B.ID) 参数,该参数与其他一些属性(如作业名,源文件名)一起使用以保存检查点信息。如果您更改这些属性之一的值,则Glue会将其视为不同的检查点。

答案 4 :(得分:0)