2011-05-25 5 views
12

¿Es posible realizar operaciones de estilo MapReduce en SpringBatch?Operaciones MapReduce/Aggregate en SpringBatch

Tengo dos pasos en mi trabajo por lotes. El primer paso calcula el promedio. El segundo paso compara cada valor con el promedio para determinar otro valor.

Por ejemplo, digamos que tengo una enorme base de datos de puntajes de estudiantes. El primer paso calcula el puntaje promedio en cada curso/examen. El segundo paso se comparan las puntuaciones individuales con la media para determinar el grado en base a una regla sencilla:

  1. A si puntuaciones de los estudiantes por encima de la media
  2. B si la puntuación del estudiante es la media
  3. C si las puntuaciones de los estudiantes por debajo de la media

Actualmente mi primer paso es un Sql que selecciona el promedio y lo escribe en una tabla. El segundo paso es un Sql que une puntajes promedio con puntuaciones individuales y utiliza un procesador para implementar la regla.

Hay funciones de agregación similares como avg, min usado mucho en Steps y realmente preferiría que esto se pudiera hacer en Processors manteniendo los Sqls lo más simple posible. ¿Hay alguna forma de escribir un procesador que agregue resultados en múltiples filas según un criterio de agrupación y luego escriba una media/minuto en la tabla de resultados una vez?

Este patrón se repite mucho y no estoy buscando una implementación de procesador único con un Sql que obtenga puntuaciones promedio e individuales.

Respuesta

2

Es posible. Ni siquiera necesitas más de un paso. Map-Reduce se puede implementar en un solo paso. Puede crear un paso con ItemReader y ItemWriter asociado a él. Piense en el par ItemReader -ItemWriter a partir de Map-Reduce. Puede lograr el efecto necesario mediante el uso de lector y escritor personalizado con agregación de línea adecuada. Puede ser una buena idea que su lector/escritor implemente la interfaz de Stream para garantizar la operación de almacenamiento intermedio de StepContext por lote de Spring.

Lo probé solo por diversión, pero creo que no tiene sentido ya que su capacidad de trabajo está limitada por una sola JVM, en otras palabras: no pudo alcanzar el rendimiento del entorno de producción Hadoop cluster (u otro mapa real reducir implementaciones). También será difícil escalar a medida que crezca el tamaño de tus datos.

Bonita observación pero actualmente IMO es inútil para las tareas del mundo real.

0

Considero que un marco de procesamiento por lotes debería separar la programación/configuración y las preocupaciones de tiempo de ejecución. Sería bueno si Spring Batch proporciona una solución genérica sobre una gran cantidad de procesos de procesamiento por lotes como JVM, Hadoop Cluster (también utiliza JVM), etc.

-> Escribir programas por lotes utilizando el modelo/Configuración de la programación por lotes primavera que integra otros modelos de programación como un mapa-reducen, java tradicional etc.

-> Seleccionar los tiempos de ejecución en función de su necesidad (single JVM o Hadoop Cluster o NoSQL).

Spring Data intenta resolver una parte, proporcionando un modelo de configuración unificado y uso de API para varios tipos de fuentes de datos).