繁体   English   中英

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

[英]How Spring Batch Restart logic works on hadoop job?

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

示例假设记录号为 3&7损坏了,它们转到不同的reducer,然后spring如何处理重启1.如何维护队列以跟踪上次失败的位置。 2,解决这个问题有哪些不同的方法

SpringBatch会完全执行您告诉SpringBatch要做的事情。

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

作业将在作业失败实例运行的相同数据集上运行。 通常,修改作业的输入数据集不是一个好主意-MapReduce作业的输入数据必须是不可变的(我想,您将不会修改用作输入的同一数据集)。

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

jobExecution.setStatus(BatchStatus.FAILED) 

现在,如何重新启动工作是一个很好的问题,我会在稍后回答。 但是,在重新调整问题之前,您需要问的是: 如果您的MapReduce作业的输入数据集和MapReduce作业的代码未更改,那么restrt将如何为您提供帮助?

我认为您需要某种数据集,在其中转储原始MapReduce作业无法处理的所有不良记录。 比如何处理这些损坏的记录更让您决定。

无论如何,一旦您知道失败的jobExecution的ID是什么,重新启动SpringBatch作业就很容易。 下面是代码:

final Long restartId = jobOperator.restart(failedJobId);
final JobExecution restartExecution = jobExplorer.getJobExecution(restartId);

编辑

阅读有关ItemReader,ItemWriter和ItemProcessor接口的信息,我认为您可以使用CompositeItemProcessor来实现跟踪。 在Hadoop中,文件中的每个记录都必须具有唯一的ID。 因此,我认为您可以将不良记录的ID列表存储在Job上下文中。 更新您在首次启动作业时将创建的JobParameter ,将其badRecordsList 现在,当您重新启动/恢复作业时,您将读取badRecordsList的值并具有引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM