Apache spark 在Spark Streaming中,如何处理旧数据和删除已处理的数据

Apache spark 在Spark Streaming中,如何处理旧数据和删除已处理的数据,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我们正在运行一个Spark流作业,该作业从目录检索文件(使用textFileStream)。 我们关心的一个问题是,作业已停止,但文件仍在添加到目录中。 一旦作业再次启动,这些文件将不会被拾取(因为它们在作业运行时不是新的或更改的),但我们希望对它们进行处理 1) 有解决办法吗?是否有办法跟踪已处理的文件,我们是否可以“强制”提取旧文件 2) 有没有办法删除处理过的文件 下面的文章几乎涵盖了你所有的问题 1) 有解决办法吗?是否有办法跟踪已处理的文件,我们是否可以“强制”提取旧文件 启动作业/

我们正在运行一个Spark流作业,该作业从目录检索文件(使用textFileStream)。 我们关心的一个问题是,作业已停止,但文件仍在添加到目录中。 一旦作业再次启动,这些文件将不会被拾取(因为它们在作业运行时不是新的或更改的),但我们希望对它们进行处理

1) 有解决办法吗?是否有办法跟踪已处理的文件,我们是否可以“强制”提取旧文件


2) 有没有办法删除处理过的文件

下面的文章几乎涵盖了你所有的问题

1) 有解决办法吗?是否有办法跟踪已处理的文件,我们是否可以“强制”提取旧文件

启动作业/应用程序时,流读取器使用系统时钟启动批处理窗口。显然,以前创建的所有文件都将被忽略。尝试启用检查点

2) 有没有办法删除处理过的文件

删除文件可能是不必要的。如果检查点工作正常,则Spark会识别未处理的文件。如果出于某种原因要删除文件,请实现自定义输入格式和读取器(请参阅文章)以捕获文件名,并酌情使用此信息。但是我不推荐这种方法。

有没有办法删除处理过的文件

根据我的经验,我无法使用检查点功能,因此我必须删除/移动进入每个批次的已处理文件

获取这些文件的方法有点棘手,但基本上我们可以说它们是当前
RDD
的祖先(依赖项)。然后,我使用的是一种递归方法,它对该结构进行爬网,并恢复以
hdfs
开头的
RDD
s的名称

  /**
    * Recursive method to extract original metadata files involved in this batch.
    * @param rdd Each RDD created for each batch.
    * @return All HDFS files originally read.
    */
   def extractSourceHDFSFiles(rdd: RDD[_]): Set[String] = {

     def extractSourceHDFSFilesWithAcc(rdd: List[RDD[_]]) : Set[String] = {

      rdd match {
        case Nil => Set()
        case head :: tail => {
          val name = head.toString()
          if (name.startsWith("hdfs")){
            Set(name.split(" ")(0)) ++ extractSourceHDFSFilesWithAcc(head.dependencies.map(_.rdd).toList) ++ extractSourceHDFSFilesWithAcc(tail)
          }
          else {
            extractSourceHDFSFilesWithAcc(head.dependencies.map(_.rdd).toList) ++ extractSourceHDFSFilesWithAcc(tail)
          }
        }
      }
    }

    extractSourceHDFSFilesWithAcc(rdd.dependencies.map(_.rdd).toList)
  }
因此,在
forEachRDD
方法中,您可以轻松地调用它:

stream.forEachRDD(rdd -> {

     val filesInBatch = extractSourceHDFSFiles(rdd)
    logger.info("Files to be processed:")

    // Process them

    // Delete them when you are done
})

令人惊讶的是,这是一个完全相同的问题(逐字逐句)在这个两年前的spark用户邮件列表上被问到。那封邮件的回复是否回答了你的疑问?检查点对你有用吗?网站“blog.yanchen.im”已不存在。如何获取处理过的文件名?@Charlie木匠 见下面我的评论