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 表

大数据入门核心技术-Spark执行Spark任务的两种方式:spark-submit和spark-shell

Spark调度模式-FIFO和FAIR

6task,线程和executor间的关系

Spark开发指南

spark怎样并发的从mysql查询数据