如何解决Spark 作业重新加载后,目标同步 S3 存储桶中的重复数据
Cloudera 集群 (CDH 6.3.3) 上的 Spark 作业使用选项 .write.mode("overwrite") 将 Parquet 文件写入 s3bucket1 有一个复制规则将数据从 s3bucket1 同步到 s3bucket2。规则中已启用删除标记复制。 如果 Spark Job 重新启动了几次,之前的文件留在目标 s3bucket2(在 s3bucket1 中一切正常)。 所以最后在 s3bucket2 中有重复的数据。 与 S3 writer 相关的 Spark 参数:
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
spark.hadoop.fs.s3a.multiobjectdelete.enable=false
如果从源位置 s3bucket1 手动删除文件(通过 AWS 控制台),复制的文件也删除得很好。但是当 Spark 这样做时 - 以前的文件留在目标 s3bucket2 存储桶中。 看起来 Spark 使用了错误/过时的 API/方法来删除 S3 上的对象。
解决方法
- 启用多对象删除,因为它可以更快地进行批量删除
- 切换到 S3A 提交器,CDH6.x 确实支持它,它们既快速又提供 s3 上的正确性,这是经典的按重命名提交器所缺乏的
- “复制规则”是什么意思?您是否有复制数据的工具(例如 distcp?),或者您是否尝试在 spark 中执行此操作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。