我有启用了检查点的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中读取。
答案 0 :(得分:2)
我知道在检查点之后重新处理的唯一方法是在没有检查点的情况下运行或设置新的空检查点目录。这将重新处理所有内容。