SPARK:重新处理失败的记录,用新的代码更改来处理那些失败?

时间:2018-12-06 19:16:34

标签: amazon-s3 amazon-emr spark-structured-streaming

我有启用了检查点的Spark结构化流作业,如

df.writeStream .option("checkpointLocation", "s3://path/to/bucket/") .forEachWriter(customForEachWriterImp) .start()

foreachwriter旨在跳过不良记录,并且我们正在基于AWS Cloudtrail构建仪表板以跟踪跳过的不良记录,因此我们可以进行必要的代码更改并重新部署,但是由于这种不良行为记录的偏移量已经过检查点,尽管我们有新的代码可以处理那些最初的不良数据,但Spark不会再次尝试从S3读取此对象。

原因是我们不想错过任何记录的处理, 除非s3数据完全坏,否则我们甚至都不会重新部署代码更改(并将其视为杂音)。

因此,例如:在S3 json对象record1中,如果按照原始模式将字段a设为integer,则Spark的自定义ForEachWriter将将该记录视为坏记录,但从逻辑上讲它不是坏记录,因此我们想修复代码以将该字段作为double处理,这也将适合原始integer和{{ 1}},因此我们将重新部署代码。

现在,当我们重新部署时,我们希望重新处理基于旧的坏double的记录,即使它的偏移量已经在S3中被检查点了。

在Amazon EMR上运行的火花作业,从Amazon S3中读取。

1 个答案:

答案 0 :(得分:2)

我知道在检查点之后重新处理的唯一方法是在没有检查点的情况下运行或设置新的空检查点目录。这将重新处理所有内容。