Spring Batch中的MapReduce / Aggregation操作

时间:2011-05-25 06:55:38

标签: java mapreduce batch-processing spring-batch

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

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

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

  1. 如果学生得分高于平均水平
  2. B如果学生成绩为平均
  3. C如果学生得分低于平均水平
  4. 目前我的第一步是选择平均值并将其写入表格的Sql。第二步是一个Sql,它将平均分数与个人分数相结合,并使用Processor来实现规则。

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

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

2 个答案:

答案 0 :(得分:2)

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

我尝试它只是为了好玩,但我认为这是毫无意义的,因为您的工作能力受到单个JVM的限制,换句话说:您无法达到Hadoop集群(或其他真实地图缩减实施)生产环境性能。随着数据量的增长,它也很难被扩展。

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

答案 1 :(得分:0)

我觉得批处理框架应该将编程/配置和运行时问题分开。如果Spring批处理在所有主要的批处理运行时提供通用解决方案,如JVM,Hadoop Cluster(也使用JVM),那将是很好的。等

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

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

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