java - Spring Batch Restart 逻辑如何在 hadoop 作业上工作?

标签 java spring hadoop spring-boot spring-batch

假设我有 10 条记录,其中一些是损坏的记录,那么 spring 将如何处理重启。

示例假设记录号。 3 和 7 已损坏,它们转到不同的 reducer ,然后 spring 将如何处理重启
1.它将如何维护队列以跟踪上次失败的位置。
2.我们可以解决这个问题的不同方法是什么

最佳答案

SpringBatch 将完全按照您告诉 SpringBatch 执行的操作。

重新启动 SpringBatch 意味着使用相同的输入参数集运行失败的相同作业。但是,将创建此作业的新实例(执行)。

该作业将在 上运行相同的数据集作业的失败实例继续运行。
一般来说,为您的作业修改输入数据集不是一个好主意 - MapReduce 作业的输入数据必须是不可变的(我假设您不会修改用作输入的相同数据集)。

在您的情况下,这项工作可能会通过 BatchStatus.COMPLETED 完成。除非你在 中加入了非常具体的逻辑。最后一步你的 SpringBatch 工作。
最后一步将验证所有记录,如果人为检测到任何损坏的记录,则将作业状态设置为 BatchStatus.FAILED如下所示:

jobExecution.setStatus(BatchStatus.FAILED) 

现在如何重新开始工作是一个很好的问题,我稍后会回答。
但是,在重新开始之前您需要问的问题是:如果您的 MapReduce 作业的输入数据集和您的 MapReduce 作业的代码没有改变,restrt 将如何帮助您?

我认为您需要有某种数据集来转储原始 MapReduce 作业未能处理的所有不良记录。而如何处理这些损坏的记录则由您决定。

无论如何,重启 SpringBatch 作业很容易,一旦你知道失败的 ID 是什么 jobExecution .下面是代码:
final Long restartId = jobOperator.restart(failedJobId);
final JobExecution restartExecution = jobExplorer.getJobExecution(restartId);

编辑

阅读 ItemReader, ItemWriter and ItemProcessor接口(interface)
我认为您可以使用 CompositeItemProcessor 实现跟踪.
在 Hadoop 中,文件中的每条记录都必须具有唯一的 ID。因此,我认为您可以将不良记录的 ID 列表存储在 Job 上下文中。更新 JobParameter您将在第一次开始作业时创建,将其命名为 badRecordsList .现在,当您重新启动/恢复您的工作时,您将读取 badRecordsList 的值并且会有引用。

关于java - Spring Batch Restart 逻辑如何在 hadoop 作业上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036360/

相关文章:

java - 无法确定合适的驱动程序类别

java - log4j2线程上下文的配置

java - 即使将库添加到 hadoop 文件夹后也找不到 BSONFileInputFormat

java - javax.servlet.error.exception 属性是否总是转换为 java.lang.Exception 类型?

java - Scala Spark MLLib NoClassDefFoundError

java - 每分钟都会调用远程 Web 服务,而无需我调用它们

ubuntu - Ambari 服务器 java 进程终止,退出代码为 -1

java - 在每个方法中不关闭 javax.sql.DataSource 可以吗?

java - 用于远程 JNDI 查找的 Glassfish NameNotFoundException

使用 log4j 的 Hadoop Yarn 任务级日志记录