java—spring批处理重启逻辑如何在hadoop作业上工作?

rta7y2nd  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(373)

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

dwbf0jvd

dwbf0jvd1#

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和itemprocessor接口的文章,我认为使用compositeitemprocessor可以实现跟踪。在hadoop中,文件中的每个记录都必须有一个唯一的id。因此,我认为您可以将坏记录的id列表存储在作业上下文中。更新 JobParameter 在作业第一次启动时创建的,称为 badRecordsList . 现在,当您重新启动/恢复作业时,您将读取 badRecordsList 会有一个参考资料。

相关问题