Ridimensionare i processi di Analisi di flusso di Azure per aumentare la velocità effettivaScale Azure Stream Analytics jobs to increase throughput

Questo articolo illustra come ottimizzare una query per aumentare la velocità effettiva per i processi di Analisi di flusso.This article shows you how to tune a Stream Analytics query to increase throughput for Streaming Analytics jobs. È possibile usare la seguente guida per ridimensionare il processo per gestire carichi più elevati e sfruttare i vantaggi di più risorse di sistema (ad esempio maggiore larghezza di banda, più risorse della CPU, una maggiore memoria).You can use the following guide to scale your job to handle higher load and take advantage of more system resources (such as more bandwidth, more CPU resources, more memory). Come prerequisito, è necessario leggere gli articoli seguenti:As a prerequisite, you may need to read the following articles:

Caso 1: la query è intrinsecamente completamente eseguibile in parallelo tra le partizioni di inputCase 1 – Your query is inherently fully parallelizable across input partitions

Se la query è intrinsecamente completamente eseguibile in parallelo tra le partizioni di input, è possibile seguire la procedura seguente:If your query is inherently fully parallelizable across input partitions, you can follow the following steps:

  1. Creare la query in modo che sia perfettamente parallela usando la parola chiave PARTITION BY.Author your query to be embarrassingly parallel by using PARTITION BY keyword. Visualizzare altri dettagli nella sezione dei processi perfettamente paralleli in questa pagina.See more details in the Embarrassingly parallel jobs section on this page.
  2. A seconda dei tipi di output usati nella query, alcuni output potrebbero non essere eseguibili in parallelo, o richiederebbero un'altra configurazione perfettamente parallela.Depending on output types used in your query, some output may either be not parallelizable, or need further configuration to be embarrassingly parallel. Ad esempio, gli output SQL, SQL DW e Power BI non sono eseguibili in parallelo.For example, SQL, SQL DW, and PowerBI outputs are not parallelizable. Gli output vengono sempre uniti prima di essere inviati al sink di output.Outputs are always merged before sending to the output sink. I BLOB, le tabelle, l'ADLS, il Bus di servizio e la funzione di Azure vengono parallelizzati automaticamente.Blobs, Tables, ADLS, Service Bus, and Azure Function are automatically parallelized. CosmosDB e Hub eventi devono avere il set di configurazione PartitionKey per la corrispondenza con il campo PARTITION BY (in genere PartitionId).CosmosDB and Event Hub needs to have the PartitionKey configuration set to match with the PARTITION BY field (usually PartitionId). Per l'Hub eventi, prestare anche particolare attenzione a far corrispondere il numero di partizioni per tutti gli input e output per evitare il cross-over tra le partizioni.For Event Hub, also pay extra attention to match the number of partitions for all inputs and all outputs to avoid cross-over between partitions.
  3. Eseguire la query con SU 6 (ovvero la capacità massima di un singolo nodo di calcolo) per misurare la velocità effettiva massima ottenibile, e se si usa GROUP BY, misurare il numero di gruppi (cardinalità) che il processo riesce a gestire.Run your query with 6 SU (which is the full capacity of a single computing node) to measure maximum achievable throughput, and if you are using GROUP BY, measure how many groups (cardinality) the job can handle. Di seguito sono elencati i sintomi generali dei limiti della risorsa del sistema nel raggiungere il processo.General symptoms of the job hitting system resource limits are the following.
    • La metrica di utilizzo % SU è superiore all'80%.SU % utilization metric is over 80%. Indica che l'uso della memoria è elevato.This indicates memory usage is high. I fattori che contribuiscono all'aumento della metrica sono descritti qui.The factors contributing to the increase of this metric are described here.
    • Il timestamp di output è in ritardo rispetto all'ora.Output timestamp is falling behind with respect to wall clock time. A seconda della logica della query, il timestamp di output potrebbe avere un offset della logica dall'ora.Depending on your query logic, the output timestamp may have a logic offset from the wall clock time. Tuttavia, dovrebbero procedere approssimativamente allo stesso ritmo.However, they should progress at roughly the same rate. Se il timestamp di output è sempre più in ritardo, è un indicatore del fatto che il sistema è in overworking.If the output timestamp is falling further and further behind, it’s an indicator that the system is overworking. Può trattarsi di un risultato della limitazione del sink di output di downstream o dell'uso elevato del CPU.It can be a result of downstream output sink throttling, or high CPU utilization. Non si fornisce una metrica di utilizzo del CPU in questa fase, pertanto può essere difficile distinguere i due.We don’t provide CPU utilization metric at this time, so it can be difficult to differentiate the two.
      • Se il problema è dovuto alla limitazione del sink, potrebbe essere necessario aumentare il numero di partizioni di output (e anche le partizioni di input per mantenere il processo completamente eseguibili in parallelo) o aumentare la quantità di risorse del sink (ad esempio il numero di unità di richiesta per CosmosDB).If the issue is due to sink throttling, you may need to increase the number of output partitions (and also input partitions to keep the job fully parallelizable), or increase the amount of resources of the sink (for example number of Request Units for CosmosDB).
    • Nel diagramma del processo è presente una metrica dell'evento per backlog di partizione per ogni input.In job diagram, there is a per partition backlog event metric for each input. Se la metrica dell'evento di backlog continua ad aumentare, è anche un indicatore del fatto che la risorsa del sistema è vincolata (o a causa della limitazione del sink di output o a causa del CPU elevato).If the backlog event metric keeps increasing, it’s also an indicator that the system resource is constrained (either because of output sink throttling, or high CPU).
  4. Dopo aver determinato i limiti di ciò che può essere raggiunto da un processo di 6 unità di ricerca, è possibile estrapolare in modo lineare la capacità di elaborazione del processo quando si aggiungono altre unità di ricerca, presupponendo che non siano presenti asimmetrie di dati che rendono una determinata partizione "critica".Once you have determined the limits of what a 6 SU job can reach, you can extrapolate linearly the processing capacity of the job as you add more SUs, assuming you don’t have any data skew that makes certain partition “hot.” >[!Note] > Scegliere il numero giusto di Unità di Streaming: poiché l'Analisi di flusso di Azure crea un nodo di elaborazione per ogni 6 unità di ricerca aggiunta, è consigliabile rendere il numero di nodi un divisore del numero di partizioni di input, in modo che le partizioni possano essere distribuite uniformemente tra i nodi.Choose the right number of Streaming Units: Because Stream Analytics creates a processing node for each 6 SU added, it’s best to make the number of nodes a divisor of the number of input partitions, so the partitions can be evenly distributed across the nodes. > Ad esempio, si è misurato che il processo delle 6 unità di ricerca può raggiungere i 4 MB/s di velocità di elaborazione e il conteggio delle partizioni di input è pari a 4.For example, you have measured your 6 SU job can achieve 4 MB/s processing rate, and your input partition count is 4. È possibile scegliere di eseguire il processo con 12 unità di ricerca per ottenere una velocità di elaborazione di circa 8 MB/s, o 24 unità di ricerca per raggiungere i 16 MB/s.You can choose to run your job with 12 SU to achieve roughly 8 MB/s processing rate, or 24 SU to achieve 16 MB/s. È possibile decidere quando aumentare il numero di unità di ricerca per il processo a qualsiasi valore, come una funzione del tasso di input.You can then decide when to increase SU number for the job to what value, as a function of your input rate.

Caso 2 - se la query non è perfettamente parallela.Case 2 - If your query is not embarrassingly parallel.

Se la query non è perfettamente parallela, è possibile seguire la procedura seguente.If your query is not embarrassingly parallel, you can follow the following steps.

  1. Iniziare prima con una query senza PARTITION BY per evitare la complessità del partizionamento ed eseguire la query con 6 unità di ricerca per misurare il carico massimo come nel Caso 1.Start with a query with no PARTITION BY first to avoid partitioning complexity, and run your query with 6 SU to measure maximum load as in Case 1.
  2. Se è possibile ottenere il carico previsto in termini di velocità effettiva, l'operazione è conclusa.If you can achieve your anticipated load in term of throughput, you are done. In alternativa è possibile scegliere di misurare lo stesso processo in esecuzione su SU 3 e SU 1 per determinare il numero minimo di SU adeguato per il proprio scenario.Alternatively, you may choose to measure the same job running at 3 SU and 1 SU, to find out the minimum number of SU that works for your scenario.
  3. Se non è possibile ottenere la velocità effettiva desiderata, provare a suddividere la query in più passaggi, se possibile e se non dispone già di più passaggi e allocare fino a SU 6 per ogni passaggio nella query.If you can’t achieve the desired throughput, try to break your query into multiple steps if possible, if it doesn’t have multiple steps already, and allocate up to 6 SU for each step in the query. Ad esempio, se si dispone di 3 passaggi, allocare 18 unità di ricarca nell'opzione "Scalabilità".For example if you have 3 steps, allocate 18 SU in the “Scale” option.
  4. Durante l'esecuzione di un processo di questo tipo, l'Analisi di flusso di Azure colloca ogni passaggio nel proprio nodo con 6 risorse dell'unità di risorse dedicate.When running such a job, Stream Analytics puts each step on its own node with dedicated 6 SU resources.
  5. Se ancora non è stata raggiunta la destinazione del carico, è possibile tentare di usare PARTITION BY a partire dai passaggi più vicini all'input.If you still haven’t achieved your load target, you can attempt to use PARTITION BY starting from steps closer to the input. Per l'operatore GROUP BY che non può essere partizionabile naturalmente, è possibile usare il modello di aggregazione globale o locale per eseguire un GROUP BY partizionato seguito da un GROUP BY non partizionato.For GROUP BY operator that may not be naturally partitionable, you can use the local/global aggregate pattern to perform a partitioned GROUP BY followed by a non-partitioned GROUP BY. Ad esempio, se si desidera contare quante automobili attraversano ciascun casello ogni 3 minuti e il volume dei dati va oltre ciò che può essere gestito da 6 unità di ricerca.For example, if you want to count how many cars going through each toll booth every 3 minutes, and the volume of the data is beyond what can be handled by 6 SU.

Query:Query:

WITH Step1 AS (
SELECT COUNT(*) AS Count, TollBoothId, PartitionId
FROM Input1 Partition By PartitionId
GROUP BY TumblingWindow(minute, 3), TollBoothId, PartitionId
)
SELECT SUM(Count) AS Count, TollBoothId
FROM Step1
GROUP BY TumblingWindow(minute, 3), TollBoothId

Nella query precedente si conteggiano le automobili per casello per partizione e quindi si somma il conteggio da tutte le partizioni insieme.In the query above, you are counting cars per toll booth per partition, and then adding the count from all partitions together.

Una volta partizionata, per ogni partizione del passaggio, allocare fino a 6 unità di risorsa, ogni partizione con 6 unità di risorsa è il valore massimo, pertanto ogni partizione può essere posizionata nel proprio nodo di elaborazione.Once partitioned, for each partition of the step, allocate up to 6 SU, each partition having 6 SU is the maximum, so each partition can be placed on its own processing node.

Nota

Se la query non può essere partizionata, l'aggiunta di altre unità di risorse in una query a più passaggi non sempre servirà a migliorare la velocità effettiva.If your query cannot be partitioned, adding additional SU in a multi-steps query may not always improve throughput. Un modo per ottenere prestazioni è quello di ridurre il volume sui passaggi iniziali usando il modello di aggregazione locale o globale, come descritto in precedenza nel passaggio 5.One way to gain performance is to reduce volume on the initial steps using local/global aggregate pattern, as described above in step 5.

Caso 3: si esegue un numero elevato di query indipendenti in un processo.Case 3 - You are running lots of independent queries in a job.

Per determinati casi d'uso ISV, in cui è più conveniente elaborare dati da più tenant in un singolo processo, usando input e output separati per ogni tenant, si finisce per eseguire delle query (ad esempio 20) indipendenti in un singolo processo.For certain ISV use cases, where it’s more cost-efficient to process data from multiple tenants in a single job, using separate inputs and outputs for each tenant, you may end up running quite a few (for example 20) independent queries in a single job. Il presupposto è che ogni carico di tale sottoquery è relativamente piccolo.The assumption is each such subquery’s load is relatively small. In questo caso, è possibile seguire la procedura seguente.In this case, you can follow the following steps.

  1. In questo caso, non usare PARTITION BY nella queryIn this case, do not use PARTITION BY in the query
  2. Se si usa l'Hub eventi, ridurre il numero di partizione di input portandolo al valore minimo di 2.Reduce the input partition count to the lowest possible value of 2 if you are using Event Hub.
  3. Eseguire la query con 6 unità di ricerca.Run the query with 6 SU. Con il carico previsto per ogni sottoquery, aggiungere più sottoquery possibili, fino a quando il processo non supera i limiti delle risorse di sistema.With expected load for each subquery, add as many such subqueries as possible, until the job is hitting system resource limits. Fare riferimento al Caso 1 per i sintomi riportati in questo caso.Refer to Case 1 for the symptoms when this happens.
  4. Quando si raggiunge il limite di sottoquery misurato in precedenza, iniziare ad aggiungere la sottoquery ad un nuovo processo.Once you are hitting the subquery limit measured above, start adding the subquery to a new job. Il numero di processi per l'esecuzione come una funzione del numero di query indipendente dovrebbe essere piuttosto lineare, presupponendo che non siano presenti asimmetrie del carico.The number of jobs to run as a function of the number of independent queries should be fairly linear, assuming you don’t have any load skew. È quindi possibile prevedere il numero di processi di 6 unità di ricerca necessari ad eseguire come una funzione del numero di tenant che si desidera gestire.You can then forecast how many 6 SU jobs you need to run as a function of the number of tenants you would like to serve.
  5. Quando si usano i join dei dati di riferimento con tali query, si dovrebbero unire gli input insieme, prima di creare un join con gli stessi dati di riferimento, quindi suddividere gli eventi se necessario.When using reference data join with such queries, you should union the inputs together, before joining with the same reference data, then split out the events if necessary. In caso contrario, ogni join dei dati di riferimento mantiene una copia dei dati di riferimento nella memoria, probabilmente ingrandendo inutilmente l'uso della memoria.Otherwise, each reference data join keeps a copy of reference data in memory, likely blowing up the memory usage unnecessarily.

Nota

Quanti tenant inserire in ogni processo?How many tenants to put in each job? Questo modello di query spesso ha un numero elevato di sottoquery e ciò comporta una topologia molto grande e complessa.This query pattern often has a large number of subqueries, and results in very large and complex topology. Il controller del processo potrebbe non essere in grado di gestire una topologia di così grandi dimensioni.The controller of the job may not be able to handle such a large topology. Come regola generale, rimanere al di sotto di 40 tenant per il processo di 1 unità di ricerca al di sotto di 60 tenant per i processi di 3 unità di ricerca e 6 unità di ricerca.As a rule of thumb, stay under 40 tenants for 1 SU job, and 60 tenants for 3 SU and 6 SU jobs. Quando si supera la capacità del controller, il processo non verrà avviato correttamente.When you are exceeding the capacity of the controller, the job will not start successfully.

Un esempio di velocità effettiva di Analisi di flusso di Azure su larga scalaAn example of Stream Analytics throughput at scale

Per illustrare la scalabilità dei processi di Analisi di flusso, è stato eseguito un esperimento in base all'input di un dispositivo Raspberry Pi.To help you understand how Stream Analytics jobs scale, we performed an experiment based on input from a Raspberry Pi device. L'esperimento ha consentito di osservare l'effetto prodotto da più unità di streaming e partizioni sulla velocità effettiva.This experiment let us see the effect on throughput of multiple streaming units and partitions.

In questo scenario il dispositivo invia i dati dei sensori (client) a un hub eventi.In this scenario, the device sends sensor data (clients) to an event hub. Analisi di flusso elabora i dati e invia come output un avviso o dati statistici a un altro hub eventi.Streaming Analytics processes the data and sends an alert or statistics as an output to another event hub.

Il client invia i dati dei sensori in formato JSONThe client sends sensor data in JSON format. e anche l'output dei dati è in formato JSON.The data output is also in JSON format. L'aspetto dei dati sarà simile al seguente:The data looks like this:

{"devicetime":"2014-12-11T02:24:56.8850110Z","hmdt":42.7,"temp":72.6,"prss":98187.75,"lght":0.38,"dspl":"R-PI Olivier's Office"}

La query seguente consente di inviare un avviso quando una luce si spegne:The following query is used to send an alert when a light is switched off:

SELECT AVG(lght), "LightOff" as AlertText
FROM input TIMESTAMP BY devicetime 
PARTITION BY PartitionID
WHERE lght< 0.05 GROUP BY TumblingWindow(second, 1)

Misurare la velocità effettivaMeasure throughput

In questo contesto la velocità effettiva è la quantità di dati di input elaborata da Analisi di flusso in un determinato intervallo di tempoIn this context, throughput is the amount of input data processed by Stream Analytics in a fixed amount of time. (10 minuti). Per ottenere la velocità effettiva di elaborazione ottimale per i dati di input, l'input del flusso dei dati e la query sono stati partizionati.(We measured for 10 minutes.) To achieve the best processing throughput for the input data, both the data stream input and the query were partitioned. Nella query è stato incluso COUNT() per misurare il numero di eventi di input che sono stati elaborati.We included COUNT() in the query to measure how many input events were processed. Per essere certi che il processo non rimanesse semplicemente in attesa dell'arrivo di eventi di input, ogni partizione dell'hub eventi di input è stata precaricata con circa 300 MB di dati di input.To make sure the job was not simply waiting for input events to come, each partition of the input event hub was preloaded with about 300 MB of input data.

La tabella seguente mostra i risultati ottenuti aumentando il numero di unità di streaming e il numero di partizioni corrispondenti negli hub eventi.The following table shows the results we saw when we increased the number of streaming units and the corresponding partition counts in event hubs.

Partizioni di inputInput PartitionsPartizioni di outputOutput PartitionsUnità di streamingStreaming UnitsVelocità effettiva sostenutaSustained Throughput
1212 1212 66 4,06 MB/s4.06 MB/s
1212 1212 1212 8,06 MB/s8.06 MB/s
4848 4848 4848 38,32 MB/s38.32 MB/s
192192 192192 192192 172,67 MB/s172.67 MB/s
480480 480480 480480 454,27 MB/s454.27 MB/s
720720 720720 720720 609,69 MB/s609.69 MB/s

Il grafico seguente illustra la relazione tra unità di streaming e velocità effettiva.And the following graph shows a visualization of the relationship between SUs and throughput.

img.stream.analytics.perfgraph

Ottenere aiutoGet help

Per ulteriore assistenza, provare il Forum di Analisi dei flussi di Azure.For further assistance, try our Azure Stream Analytics forum.

Passaggi successiviNext steps