Использование повторного секционирования для оптимизации обработки с помощью Azure Stream Analytics

В этой статье показано, как использовать повторное секционирование для масштабирования запроса Azure Stream Analytics в сценариях, в которых невозможна полная параллелизация.

Использование параллелизации может оказаться невозможным, если:

  • вы не контролируете ключ секции для входного потока;
  • ваш источник "распыляет" входные данные по нескольким секциям, которые позднее необходимо объединить.

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

Как выполнить повторное секционирование

Входные данные можно изменить двумя способами:

  1. использовать отдельное задание Stream Analytics, которое выполняет повторное секционирование;
  2. использовать одно задание, но сначала выполнить повторное секционирование перед пользовательской логикой аналитики.

Создание отдельного задания Stream Analytics для повторного секционирования входных данных

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

-- For compat level 1.2 or higher
SELECT * 
INTO output
FROM input

--For compat level 1.1 or lower
SELECT *
INTO output
FROM input PARTITION BY PartitionId

Повторное секционирование входных данных в рамках одного задания Stream Analytics

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

WITH RepartitionedInput AS 
( 
    SELECT * 
    FROM input PARTITION BY DeviceID
)

SELECT DeviceID, AVG(Reading) as AvgNormalReading  
INTO output
FROM RepartitionedInput  
GROUP BY DeviceId, TumblingWindow(minute, 1)  

Следующий пример запроса соединяет два потока повторно секционированных данных. При присоединении двух потоков повторно разделенных данных потоки должны иметь один и тот же ключ секции и количество. Результатом будет поток, имеющий единую схему секционирования.

WITH step1 AS 
(
    SELECT * FROM input1 
    PARTITION BY DeviceID
),
step2 AS 
(
    SELECT * FROM input2 
    PARTITION BY DeviceID
)

SELECT * INTO output 
FROM step1 PARTITION BY DeviceID 
UNION step2 PARTITION BY DeviceID

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

Единицы потоковой передачи для повторного секционирования

Экспериментируйте и следите за использованием ресурсов задания, чтобы определить точное необходимое количество секций. Количество единиц потоковой передачи (SU) должно быть скорректировано в соответствии с физическими ресурсами, необходимыми для каждой секции. Как правило, для каждой секции требуется шесть единиц потоковой передачи. При нехватке ресурсов, выделенных для задания, система применит повторное секционирование только в том случае, если это повысит производительность задания.

Повторное секционирование для выходных данных SQL

Если в задании для вывода используется база данных SQL, используйте явное повторное секционирование, чтобы обеспечить соответствие оптимальному количеству разделов для повышения пропускной способности. Так как SQL лучше всего работает с восемью писателями, перерасчет потока до восьми перед очисткой или где-то еще вышестоящий, может повысить производительность заданий.

Если существует более восьми входных секций, наследование схемы секционирования входных данных может не быть подходящим вариантом. Рекомендуется использовать в запросе INTO, чтобы явно указать число модулей записи вывода.

Следующий пример считывает из входных данных, независимо от того, выполняется ли их естественное секционирование, и выполняет десятикратное повторное секционирование потока в соответствии с измерением DeviceID, а затем передает данные для вывода.

SELECT * INTO [output] 
FROM [input] 
PARTITION BY DeviceID INTO 10

Дополнительные сведения см. в статье Вывод данных Azure Stream Analytics в базу данных SQL Azure.

Следующие шаги