Partilhar via


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

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

Talvez não seja possível usar a paralelização se:

  • Você não controla a chave de partição para seu fluxo de entrada.
  • Sua fonte "pulveriza" a entrada em várias partições que mais tarde precisam ser mescladas.

O reparticionamento, ou reorganização, é necessário quando você processa dados em um fluxo que não é fragmentado de acordo com um esquema de entrada natural, como PartitionId para Hubs de Eventos. Quando você reparticiona, cada fragmento pode ser processado de forma independente, o que permite dimensionar linearmente seu pipeline de streaming.

Como reparticionar

Você pode reparticionar sua entrada de duas maneiras:

  1. Use um trabalho separado do Stream Analytics que faça o reparticionamento
  2. Use um único trabalho, mas faça o reparticionamento primeiro antes da lógica de análise personalizada

Criando um trabalho separado do Stream Analytics para reparticionar a entrada

Você pode 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 no qual você implementa sua lógica de análise. Ao configurar essa saída do hub de eventos em seu trabalho, você deve especificar a chave de partição pela qual o Stream Analytics irá 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

Reparticionar a 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 seria:

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)  

A consulta de exemplo 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 do esquema de fluxo e contar 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 aumenta a 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 que você precisa. O número de unidades de streaming (SU) deve ser ajustado de acordo com os recursos físicos necessários para cada partição. Em geral, são necessários seis SUs para cada partição. Se não houver recursos suficientes atribuídos ao trabalho, o sistema só aplicará a repartição se ela beneficiar o trabalho.

Repartições para saída SQL

Quando seu trabalho usa o 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 a montante, pode beneficiar o desempenho do trabalho.

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

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

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

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

Próximos passos