12

是否可以在 SpringBatch 中进行 MapReduce 样式的操作?

我的批处理作业有两个步骤。第一步计算平均值。第二步将每个值与平均值进行比较以确定另一个值。

例如,假设我有一个庞大的学生成绩数据库。第一步计算每门课程/考试的平均分数。第二步将个人分数与平均分数进行比较,以根据一些简单的规则确定成绩:

  1. A 如果学生成绩高于平均水平
  2. B 如果学生成绩是平均
  3. C 如果学生成绩低于平均水平

目前我的第一步是选择平均值并将其写入表的 Sql。第二步是将平均分数与个人分数连接起来并使用处理器来实现规则的 Sql。

有类似的聚合函数,如 avg,min 在 Steps 中使用了很多,如果这可以在保持 Sqls 尽可能简单的处理器中完成,我真的更喜欢。有没有办法编写一个处理器,它根据分组标准聚合多行的结果,然后将平均值/最小值写入输出表一次?

这种模式重复了很多,我不是在寻找一个使用 Sql 的单处理器实现,它可以同时获取平均分数和个人分数。

4

2 回答 2

2

有可能的。你甚至不需要超过一个步骤。Map-Reduce 可以一步实现。您可以创建一个与 ItemReader 和 ItemWriter 关联的步骤。将 ItemReader -ItemWriter 对视为 Map-Reduce。您可以通过使用带有适当行聚合的自定义读取器和写入器来实现必要的效果。对于您的阅读器/编写器来说,实现 Stream 接口以保证 Spring 批处理的中间 StepContext 保存操作可能是一个好主意。

我只是为了好玩而尝试它,但我认为这毫无意义,因为您的工作能力受到单个 JVM 的限制,换句话说:您无法达到 Hadoop 集群(或其他真正的 map reduce implementationns)生产环境性能。此外,随着数据大小的增长,将很难进行可扩展。

很好的观察,但 IMO 目前对现实世界的任务无用。

于 2012-04-27T11:37:30.690 回答
0

我觉得批处理框架应该将编程/配置和运行时问题分开。如果 Spring Batch 为所有主要的批处理运行时间提供通用解决方案,例如 JVM、Hadoop 集群(也使用 JVM)等,那就太好了。

-> 使用 Spring 批处理编程/配置模型编写批处理程序,该模型集成了其他编程模型,如 map-reduce、传统 java 等。

-> 根据需要选择运行时(单个 JVM 或 Hadoop 集群或 NoSQL)。

Spring Data 尝试解决一部分,为各种类型的数据源提供统一的配置模型和 API 使用。)。

于 2013-05-16T02:54:00.850 回答