2016-02-12 107 views
0

我们有一个弹簧批处理作业,我们试图处理大约1000万条记录。现在在单线程中这样做会很慢,因为我们必须匹配SLA。spring批处理分区性能问题

为了提高性能,我们开发了一个POC,其中主步骤创建分区,其中每个分区表示一个唯一的产品ID。这可以从500到4500之间的任何范围。在POC中,我们有500个这样的独特产品ID。现在每个分区都有一个prod id,并在其上进行操作。所有这些端到端工作正常。

我们注意到,主步骤需要5分钟以上才能将分区信息发送到步骤执行请求。我的意思是说,主步骤生成分区和正在执行的第1个分区的步骤之间有5分钟以上的差异。

什么可能导致这种缓慢?春季批量框架在这5分钟内做了什么?

下面是该过程中5分钟,这么多的时间执行的3个选择

SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION, JOB_CONFIGURATION_LOCATION from BATCH_JOB_EXECUTION where JOB_INSTANCE_ID = ? order by JOB_EXECUTION_ID desc; 

SELECT JOB_EXECUTION_ID,KEY_NAME,TYPE_CD,STRING_VAL,DATE_VAL,LONG_VAL,DOUBLE_VAL,从BATCH_JOB_EXECUTION_PARAMS查明JOB_EXECUTION_ID =?; SELECT STEP_EXECUTION_ID,STEP_NAME,START_TIME,END_TIME,STATUS,COMMIT_COUNT,READ_COUNT,FILTER_COUNT,WRITE_COUNT,EXIT_CODE,EXIT_MESSAGE,READ_SKIP_COUNT,WRITE_SKIP_COUNT,PROCESS_SKIP_COUNT,ROLLBACK_COUNT,LAST_UPDATED,从BATCH_STEP_EXECUTION其中JOB_EXECUTION_ID = VERSION?按STEP_EXECUTION_ID排序;

回答

0

看看你的工作库的配置。一旦Partitioner为每个从属步骤创建了ExecutionContext,主设备在为每个从设备创建一个StepExecution,然后将其发送给从属设备进行处理。所以这种滞后可能是由于将所有这些StepExecutions插入到作业存储库中。作为后续,请确保您使用的是最新版本。不久之前就进行了一次优化(批量插入执行,而不是逐个执行)。

+0

谢谢迈克尔。我们使用spring批处理3.0.3并查看它执行的日志组3选择。请参阅我选择的原始评论。看着插入,它只发生一次保存上下文信息 – user509755

+0

另外我还有一个关于工作回购的问题。看你的工作回购配置是什么意思? – user509755

+1

我注意到的是,上述3个选择(原始评论)正在执行每个parition和3个选择合并需要1秒。所以如果我们有500分的话那么它就是这3分选的500倍。这是大部分时间 – user509755