Операции MapReduce/Aggregate в SpringBatch

Можно ли выполнять операции стиля MapReduce в SpringBatch?

У меня есть два шага в моей пакетной работе. Первый шаг вычисляет среднее значение. На втором этапе каждое значение сравнивается со средним, чтобы определить другое значение.

Например, допустим, у меня есть огромная база данных с оценками учащихся. На первом этапе рассчитывается средний балл по каждому курсу/экзамену. На втором этапе отдельные баллы сравниваются со средними, чтобы определить оценку на основе некоторого простого правила:

  1. A, если учащийся набрал выше среднего
  2. B, если балл ученика средний
  3. C, если учащийся набирает ниже среднего

В настоящее время моим первым шагом является Sql, который выбирает среднее значение и записывает его в таблицу. Второй шаг — это Sql, который объединяет средние оценки с индивидуальными оценками и использует процессор для реализации правила.

Существуют аналогичные функции агрегации, такие как avg, min, которые часто используются в Steps, и я действительно предпочел бы, чтобы это можно было сделать в процессорах, сохраняя Sqls как можно более простыми. Есть ли способ написать процессор, который агрегирует результаты по нескольким строкам на основе критериев группировки, а затем один раз записывает среднее/минимальное значение в выходную таблицу?

Этот шаблон часто повторяется, и я не ищу реализацию с одним процессором, использующую Sql, которая извлекает как средние, так и индивидуальные оценки.


person Sathish    schedule 25.05.2011    source источник


Ответы (2)


Это возможно. Вам даже не нужно больше одного шага. Map-Reduce можно реализовать за один шаг. Вы можете создать шаг со связанными с ним ItemReader и ItemWriter. Думайте о паре ItemReader-ItemWriter как о Map-Reduce. Вы можете добиться необходимого эффекта, используя пользовательский ридер и писатель с правильной агрегацией строк. Для вашего читателя/писателя может быть хорошей идеей реализовать интерфейс Stream, чтобы гарантировать промежуточную операцию сохранения StepContext пакетом Spring.

Я попробовал это просто для удовольствия, но я думаю, что это бессмысленно, поскольку ваша рабочая мощность ограничена одной JVM, другими словами: вы не можете достичь производительности рабочей среды кластера Hadoop (или другой реальной карты, уменьшающей реализацию). Также будет очень сложно масштабироваться по мере роста размера ваших данных.

Хорошее наблюдение, но IMO в настоящее время бесполезен для реальных задач.

person aviad    schedule 27.04.2012

Я считаю, что структура пакетной обработки должна разделять проблемы программирования/конфигурации и времени выполнения. Было бы неплохо, если бы весенняя партия предоставила общее решение для всех основных сред выполнения пакетной обработки, таких как JVM, Hadoop Cluster (также использует JVM) и т. д.

-> Написание пакетных программ с использованием модели пакетного программирования/конфигурации Spring, которая интегрирует другие модели программирования, такие как уменьшение карты, традиционная Java и т. д.

-> Выберите время выполнения в зависимости от ваших потребностей (одна JVM или кластер Hadoop или NoSQL).

Попытки Spring Data решают часть проблемы, предоставляя унифицированную модель конфигурации и использование API для различных типов источников данных.).

person user2388173    schedule 16.05.2013