Нераспределенные данные _ Spring Batch Partitioner - PullRequest
0 голосов
/ 16 июня 2020

Просто возьмем случай, когда я читаю данные из базы данных с условиями (миллионы строк), занимаюсь бизнесом с данными и затем обновляю их.

Я использую разделитель диапазона столбцов (столбец Id) принятие Min и Max идентификаторов для обработки и создание разделов с max-min / gridSize.

Теперь представьте, что у меня есть идентификаторы 1, 22, 23, 24, 30 с gridSize = 3, с этим logi c у меня будет 3 раздела:

раздел1 идентификатор обработки 1

раздел2 обработка 0 строк

раздел3 обработка 22, 23, 24 и 30

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

Какое лучшее решение?

1 Ответ

1 голос
/ 17 июня 2020

Значение ColumnRangePartitioner, показанное в примерах, указывает на то, что вам нужен равномерно распределенный столбец, чтобы он был эффективным (как вы отметили). Вместо этого вы обычно можете добавить номер строки в свой запрос и разделить его, поскольку это будет последовательность результатов.

Пример SQL будет выглядеть примерно так (для MySQL) :

SELECT F.*, 
       @rownum := @rownum + 1 AS rank 
FROM FOO F, 
     (SELECT @rownum := 0) r;

При этом столбец rank будет последовательностью, автоматически генерируемой каждый раз при выполнении запроса. Исходя из этого значения, вы можете разделить набор данных. Поскольку это не является постоянным, вам нужно будет выполнить некоторую гимнастику, чтобы получить правильные идентификаторы, но базовый c logi c вашей реализации Partitioner будет выглядеть примерно так:

  1. Выполните запрос количества, чтобы узнать, сколько записей имеется в вашем наборе данных.
  2. Запустите запрос, используя описанную выше методику, чтобы выяснить, какой идентификатор базы данных является для начала и конца каждого диапазона разделов. Это даст вам идентификаторы для фильтрации по каждому разделу.
  3. Создайте раздел для каждой пары (начало / конец), используя фактические идентификаторы db.
  4. Настройте ItemReader для чтения элементов только в пределах предоставленных идентификаторов БД.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...