Usare la suddivisione per ottimizzare l'elaborazione con Analisi di flusso di Azure
Questo articolo illustra come usare la suddivisione per ridimensionare la query di Analisi di flusso di Azure per gli scenari che non possono essere completamente parallelizzati.
Potrebbe non essere possibile usare la parallelizzazione se:
- Non si controlla la chiave di partizione per il flusso di input.
- L'input "spray" di origine tra più partizioni che devono essere unite in un secondo momento.
La suddivisione o il ricompilazione sono necessarie quando si elaborano i dati in un flusso non partizionato in base a uno schema di input naturale, ad esempio PartitionId per Hub eventi. Quando si suddivide, ogni partizione può essere elaborata in modo indipendente, che consente di aumentare in modo lineare la pipeline di streaming.
Come suddividere
È possibile suddividere l'input in due modi:
- Usare un processo di Analisi di flusso separato che esegue la suddivisione
- Usare un singolo processo, ma eseguire prima la suddivisione prima della logica di analisi personalizzata
Creazione di un processo di Analisi di flusso separato per l'input di partizione
È possibile creare un processo che legge l'input e la scrittura in un output dell'hub eventi usando una chiave di partizione. Questo hub eventi può quindi fungere da input per un altro processo di Analisi di flusso in cui si implementa la logica di analisi. Quando si configura l'output dell'hub eventi nel processo, è necessario specificare la chiave di partizione in base alla quale Analisi di flusso ripartirà i dati.
-- 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
Input di repartizione all'interno di un singolo processo di Analisi di flusso
È anche possibile introdurre un passaggio nella query che ricompiliziona prima l'input e questo può quindi essere usato da altri passaggi nella query. Ad esempio, se si vuole suddividere l'input in base a DeviceId, la query sarà:
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)
Nell'esempio seguente vengono aggiunti due flussi di dati repartizionati. Quando si unisce due flussi di dati ripartiti, i flussi devono avere la stessa chiave di partizione e conteggio. Il risultato è un flusso con lo stesso schema di partizione.
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
Lo schema di output deve corrispondere alla chiave dello schema di flusso e al conteggio in modo che ogni sottostream possa essere scaricato in modo indipendente. Il flusso può anche essere unito e ripartito da uno schema diverso prima di scaricare, ma è consigliabile evitare che il metodo venga aggiunto alla latenza generale dell'elaborazione e aumenti l'utilizzo delle risorse.
Unità di streaming per le repartizioni
Sperimentare e osservare l'utilizzo delle risorse del processo per determinare il numero esatto di partizioni necessarie. Il numero di unità di streaming (SU) deve essere modificato in base alle risorse fisiche necessarie per ogni partizione. In generale, per ogni partizione sono necessarie sei UR. Se al processo sono assegnate risorse insufficienti, il sistema applicherà solo la suddivisione se ne beneficia.
Repartizioni per l'output SQL
Quando il processo usa il database SQL per l'output, usare la suddivisione esplicita per corrispondere al conteggio ottimale delle partizioni per ottimizzare la velocità effettiva. Poiché SQL funziona meglio con otto writer, la suddivisione del flusso su otto prima di scaricare o in un altro punto a monte può trarre vantaggio dalle prestazioni del processo.
Quando sono presenti più di otto partizioni di input, ereditando lo schema di partizionamento di input potrebbe non essere una scelta appropriata. Prendere in considerazione l'uso di INTO nella query per specificare in modo esplicito il numero di writer di output.
Nell'esempio seguente viene letto dall'input, indipendentemente dal fatto che sia partizionato in modo naturale e ripartizioni del flusso in base alla dimensione DeviceID e scarica i dati per l'output.
SELECT * INTO [output] FROM [input] PARTITION BY DeviceID INTO 10
Per altre informazioni, consultare Output di Analisi di flusso di Azure in Database SQL di Azure.