我如何在 Apache Spark 作业中获取一些状态?

How do I get some state in or to a Apache Spark job?

我想定期安排一个 spark 作业来处理新的输入文件(如果可用)并创建一些输出文件。我如何最好地管理文件已经成功和完全处理的状态,以便后续的 spark 作业 运行 不会再次拾取它?

这是调用者(即调度程序)的责任吗? 我应该在处理后移动或重命名输入文件吗? 解决此类问题的推荐方法是什么?

在我看来,有以下几种方法可以解决问题 -

  1. 如您所描述的那样单独使用 spark - 在这方面您有两个选择。一个是调度程序或事件,它会在一定频率后触发并获取所有文件名并处理集群上的文件。为了保持状态,您可以决定一些命名约定,例如 .completed 表示已处理的文件,.tmp 表示处理中的文件(Apache Flume)使用这种方法),或者您可以将已处理的文件一起移动到新目录。 另一个是一个文件观察器,它会轮询目录以进行修改,并在文件被修改或添加后拉出文件。然后这个文件就可以提交给spark集群进行处理了。如果您没有任何批处理要求,则首选文件观察器。
  2. 现在,其他方法完全不同。我不完全了解您的要求和目的,但是如果您希望 Spark 只处理文件并让 Flume 等其他技术处理文件或 Flume 等任何数据,您可以考虑这种方法最好这样做。您可以将 Flume 代理配置为源作为假脱机目录,您可以在其中保存文件和接收器作为 Spark(支持两种模型 - 推和拉)。通过使用这种方法,您可以利用 Flume 的容错、文件管理和弹性功能。 Flume 提供简单的输出文件管理和输出格式管理机制。