Apache spark 如何处理Spark写入错误?

Apache spark 如何处理Spark写入错误?,apache-spark,error-handling,apache-spark-sql,Apache Spark,Error Handling,Apache Spark Sql,这是一个关于火花错误处理的问题。 特别是——处理写入目标数据存储的错误 形势 我正在写入一个不支持幂等插入(在我的例子中)的非事务性数据存储,并希望实现写入失败的错误处理,以避免多次插入数据 所以我想处理的情况是: 已创建数据帧/DAG 所有已执行、已成功读取数据、在spark作业中保持(可在内存中) 写入目标-但会引发异常/中途失败/不可用 在这种情况下,Spark将重试写操作(由于自定义目标数据存储的性质,无法回滚),因此可能会重复数据 问题。 Spark处理此类案件的正确方法是什么 选项1

这是一个关于火花错误处理的问题。
特别是——处理写入目标数据存储的错误

形势

我正在写入一个不支持幂等插入(在我的例子中)的非事务性数据存储,并希望实现写入失败的错误处理,以避免多次插入数据

所以我想处理的情况是:

  • 已创建数据帧/DAG
  • 所有已执行、已成功读取数据、在spark作业中保持(可在内存中)
  • 写入目标-但会引发异常/中途失败/不可用
  • 在这种情况下,Spark将重试写操作(由于自定义目标数据存储的性质,无法回滚),因此可能会重复数据

    问题。 Spark处理此类案件的正确方法是什么

    选项1。 有没有办法在任务级别添加异常处理程序?为了一项特定的任务

    选项2。 可以将“最大重试次数”设置为1,这样整个应用程序都会失败—清理可以在外部完成—但希望做得更好:)

    选项3。 作为替代方案,我们可以在数据帧中添加一个额外的列,该列将在运行时计算,并且在重试时是唯一的(因此,我们可以在以后从外部清除所有列)。问题是-在Spark作业运行时(而不是在DAG创建期间)计算列文字的方法是什么

    所以…

    给出一个问题——有哪些选项?
    如果它是三个提议中的任何一个--它如何实现

    非常感谢您在这件事上的任何帮助

    提前感谢…

    我将在驱动程序级别实现错误处理,但这需要额外的查询(您无论如何都需要)。基本上你需要

  • 检查(新)数据是否包含重复项
  • 您的目标表/数据存储已包含此数据

    val df : DataFrame = ???
    
    df.cache() // if that fits into memory
    
    val uniqueKeys = Seq("ID")
    val noDuplicates = df.groupBy(uniqueKeys.head,uniqueKeys.tail:_*).count().where($"count">0).isEmpty
    val notAlreadyExistsInTarget = spark.table(<targettable>).join(df,uniqueKeys,"leftsemi").isEmpty
    
    if(noDuplicates && notAlreadyExistsInTarget) {
      df.write // persist to your datastore
    } else {
      throw new Exception("df contains duplicates / already exists")
    }
    
    val-df:DataFrame=???
    df.cache()//如果它适合内存
    val唯一键=序号(“ID”)
    val noDuplicates=df.groupBy(uniqueKeys.head,uniqueKeys.tail:*).count()。其中($“count”>0)。isEmpty
    val notalreadyexistintarget=spark.table().join(df,uniquekey,“leftsemi”).isEmpty
    如果(目标中已存在节点副本(&N){
    df.write//persist到您的数据存储
    }否则{
    抛出新异常(“df包含重复项/已存在”)
    }
    

  • 好问题:)我想我们需要更多地了解您的目标数据存储。