Spark覆盖模式和并发执行
Posted
技术标签:
【中文标题】Spark覆盖模式和并发执行【英文标题】:Spark overwrite mode and concurrent execution 【发布时间】:2018-12-04 01:08:35 【问题描述】:我有一个火花,我正在使用覆盖模式,例如:
.repartition(10)
.write
.mode("overwrite")
这工作正常,但由于一些代码错误,我们最终启动了同一作业的多个并发执行,并最终在 s3 文件夹中出现重复数据。
有没有办法处理并发和覆盖模式?如果没有,
有没有快速失败的方法?【问题讨论】:
重复数据可能是由于任务失败导致的 s3 一致性。将 spark 最大尝试次数保持为 1,因此不会重试。 @Achyuth 根据 OP 所述,它更多地是关于“同一作业的多个并发执行”。你在某处添加一个“脏标记”怎么样?或者使用 Redisson 之类的工具在 S3 资源上创建分布式锁。 S3 是一个分布式对象存储,其工作原理是最终一致性。那么你从哪里得到它正在启动多项工作的想法?您的输入 df 是如何构造的? 一个建议是写入 hdfs 并使用 s3-distcp 会更快。 s3中没有重命名的概念 【参考方案1】:有没有办法处理并发和覆盖模式?
并非没有更高层次的协调
有没有办法快速失败?
不要使用覆盖
一般约定是“在某处写入然后重命名到位”,这依赖于重命名是一种快速的原子方式来专门提交工作。但由于 S3 不是这样工作的,你也不能依赖它。
【讨论】:
【参考方案2】:默认情况下,Spark 中的最大尝试次数为两次。在 Spark Submit 命令中将此设置为 1 --conf spark.yarn.maxAppAttempts=1
【讨论】:
以上是关于Spark覆盖模式和并发执行的主要内容,如果未能解决你的问题,请参考以下文章
使用 Glue 连接和 spark scala 覆盖 Mysql 表