Top.Mail.Ru
1.4. Запрос на сложную обработку кластером | Tdg
 
1. Руководство по разработке приложений / 1.4. Запрос на сложную обработку кластером
1. Руководство по разработке приложений / 1.4. Запрос на сложную обработку кластером

1.4. Запрос на сложную обработку кластером

1.4. Запрос на сложную обработку кластером

Если требуется выполнить обработку всех данных в кластере, то её необходимо выполнять на всех инстансах типа storage, для этого можно использовать функцию map_reduce.

Сложная кластерная обработка по модели MapReduce в TDG состоит из 3 этапов:

  • Map – выполняется на инстансах с ролью storage;
  • Combine – выполняется на инстансах с ролью storage;
  • Reduce – выполняется на инстансе, где была вызвана функция map_reduce;

1.4.1. Синтаксис запроса

Функция map_reduce(type_name, filter, version, map_fn, combine_fn, reduce_fn, opts) имеет следующие аргументы:

  • type_name – имя агрегата
  • filter – булевы выражения / предикаты
  • version – номер версии
  • map_fn – указатель на функцию для этапа Map
  • combine_fn – указатель на функцию для этапа Combine
  • reduce_fn – указатель на функцию для этапа Reduce
  • opts – необязательные аргументы:
    • opts.map_args – дополнительные аргументы для этапа Map
    • opts.combine_args – дополнительные аргументы для этапа Combine
    • opts.combine_initial_state – исходное состояние для этапа Combine
    • opts.reduce_args – дополнительные аргументы для этапа Reduce
    • opts.reduce_initial_state – исходное состояние для этапа Reduce

1.4.2. Этап Map

Сначала на каждом инстансе c ролью storage будет вызвана функция map_fn, столько раз, сколько на этом инстансе будет найдено подходящих объектов (типа type_name и соответствующих условиям filter).

Функция map_fn применяется к каждому найденному кортежу.

local map_res, err = map_fn(tuple, opts.map_args)

Эта функция может вернуть любые данные или nil.

Если функция вернет данные, то на следующем этапе эти данные будут использованы для запуска combine_fn (которая будет вызвана столько раз, сколько раз вызовы map вернут данные).

1.4.3. Этап Combine

Эта стадия опциональна и нужна для того, чтобы по возможности уменьшить количество данных, полученных на стадии Map, перед их передачей по сети и дальнейшей обработкой.

Результат каждого вызова map_fn передаётся в combine_fn. Каждый вызов combine_fn осуществляется с передачей исходного состояния, равного результату предыдущего вызова comvine_fn (для первого вызова исходное состояние равно opts.combine_initial_state, либо, если этот параметр не задан, то равно пустой таблице).

local combine_res = opts.combine_initial_state or {}
local combine_res, err = combine_fn(combine_res, map_res, opts.combine_args)

Функция combine_fn также выполняется на роли storage.

Результат выполнения combine_fn аккумулируется в переменной combine_res и передается на ту роль, откуда был вызван map_reduce – в функцию reduce_fn.

1.4.4. Этап Reduce

Данный этап предназначен для завершения обработки данных со всего кластера.

Данные передаются по сети на инстанс, откуда была вызвана функция map_reduce. Там будет вызвана функция reduce_fn. Эта функция будет вызвана столько раз, сколько инстансов типа storage в кластере найдет подходящие объекты и, соответственно, вернет результат в combine_res.

local reduce_res, err = reduce_fn(combine_res, opts.reduce_initial_state, opts.reduce_args)

Результат reduce_fn возвращается как результат всего map_reduce.