Подтвердить что ты не робот

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

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

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

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

  • A, если учащийся превышает средний
  • B, если оценка студента Средняя
  • C, если оценка учащихся ниже среднего

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

- > Записывать пакетные программы с использованием spring пакетного программирования/модели конфигурации, которая объединяет другие модели программирования, такие как map-reduce, традиционная java и т.д.

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

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