Usar o reparticionamento para otimizar o processamento com o Azure Stream Analytics

Este artigo mostra como usar o reparticionamento para dimensionar a consulta do Azure Stream Analytics para cenários que não podem ser totalmente paralelizados.

Talvez você não consiga usar a paralelização se:

  • Você não controlar a chave de partição para o fluxo de entrada.
  • Sua origem "pulverizar" a entrada em várias partições que posteriormente precisarão ser mescladas.

O Reparticionamento, ou remanejamento, é necessário quando você processa dados em um fluxo que não é fragmento de acordo com um esquema de entrada natural, como PartitionId para Hubs de Eventos. Quando você reparticiona, cada fragmento pode ser processado independentemente, o que permite escalar linearmente o pipeline de streaming.

Como reparticionar

Você pode reparticionar sua entrada de duas maneiras:

  1. Usar um trabalho separado do Stream Analytics que faz a repartição
  2. Usar um único trabalho, mas fazer a repartição primeiro antes de sua lógica de análise personalizada

Criar um trabalho separado do Stream Analytics para reparticionar a entrada

É possível criar um trabalho que lê a entrada e grava em uma saída do hub de eventos usando uma chave de partição. Esse hub de eventos pode servir como entrada para outro trabalho do Stream Analytics em que você implementa sua lógica de análise. Ao configurar a saída desse hub de eventos em seu trabalho, você deve especificar a chave de partição pela qual o Stream Analytics reparticionará seus dados.

-- 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

Repartição de entrada em um único trabalho do Stream Analytics

Você também pode introduzir uma etapa em sua consulta que primeiro reparticiona a entrada, que pode ser usada por outras etapas em sua consulta. Por exemplo, se você quiser reparticionar a entrada com base em DeviceId, sua consulta será:

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)  

O exemplo de consulta a seguir une dois fluxos de dados reparticionados. Quando você une dois fluxos de dados reparticionados, os fluxos devem ter a mesma chave de partição e contagem. O resultado é um fluxo que tem o mesmo esquema de partição.

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

O esquema de saída deve corresponder à chave de esquema e à contagem do fluxo para que cada subfluxo possa ser liberado independentemente. O fluxo também pode ser mesclado e reparticionado novamente por um esquema diferente antes da liberação, mas você deve evitar esse método porque ele adiciona à latência geral do processamento e aumenta a utilização de recursos.

Unidades de streaming para repartições

Experimente e observe o uso de recursos do seu trabalho para determinar o número exato de partições necessárias. O número de unidades de streaming (US) deve ser ajustado de acordo com os recursos físicos necessários para cada partição. Em geral, seis USs são necessárias para cada partição. Se não houver recursos suficientes atribuídos ao trabalho, o sistema só aplicará a repartição se isso beneficiar o trabalho.

Repartições para saída de SQL

Quando seu trabalho usar banco de dados SQL para saída, use o reparticionamento explícito para corresponder à contagem de partições ideal para maximizar a taxa de transferência. Como o SQL funciona melhor com oito gravadores, reparticionar o fluxo para oito antes da liberação, ou em algum lugar mais acima, pode beneficiar o desempenho do trabalho.

Quando há mais de oito partições de entrada, a herança de entrada de esquema de particionamento pode não ser uma opção apropriada. Considere usar INTO na consulta para especificar explicitamente o número de gravadores de saída.

O exemplo a seguir lê da entrada, independentemente de ele ser naturalmente particionado, e reparticiona o fluxo por dez vezes de acordo com a dimensão de DeviceID e libera os dados para a saída.

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

Para obter mais informações, confira Saída do Azure Stream Analytics para Banco de Dados SQL do Azure.

Próximas etapas