Mettre à l’échelle des travaux Azure Stream Analytics pour augmenter le débitScale an Azure Stream Analytics job to increase throughput

Cet article vous indique comment régler une requête Stream Analytics pour augmenter le débit des travaux Stream Analytics.This article shows you how to tune a Stream Analytics query to increase throughput for Streaming Analytics jobs. Vous pouvez utiliser le guide suivant pour mettre à l’échelle votre travail afin de gérer une charge plus élevée et de bénéficier de davantage de ressources système (par exemple, plus de bande passante, de ressources processeur, de mémoire).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). Comme prérequis, vous devrez peut-être consulter les articles suivants :As a prerequisite, you may need to read the following articles:

Cas 1 : Votre requête est par définition entièrement parallélisable sur plusieurs partitions d’entréeCase 1 – Your query is inherently fully parallelizable across input partitions

Si votre requête est par définition entièrement parallélisable sur plusieurs partitions d’entrée, vous pouvez suivre les étapes suivantes :If your query is inherently fully parallelizable across input partitions, you can follow the following steps:

  1. Créez une requête massivement parallèle en utilisant le mot clé PARTITION BY.Author your query to be embarrassingly parallel by using PARTITION BY keyword. Pour plus d’informations, consultez la section Travaux massivement parallèles dans cette page.See more details in the Embarrassingly parallel jobs section on this page.
  2. En fonction des types de sorties utilisés dans votre requête, certaines sorties peuvent ne pas être parallélisables ou nécessiter une configuration supplémentaire pour être massivement parallèles.Depending on output types used in your query, some output may either be not parallelizable, or need further configuration to be embarrassingly parallel. Par exemple, la sortie PowerBI n’est pas parallélisable.For example, PowerBI output is not parallelizable. Les sorties sont toujours fusionnées avant l’envoi vers le récepteur de sortie.Outputs are always merged before sending to the output sink. Les objets blob, les tables, ADLS, Service Bus et Azure Function sont automatiquement parallélisés.Blobs, Tables, ADLS, Service Bus, and Azure Function are automatically parallelized. Les sorties SQL et Azure Synapse Analytics comportent une option pour la parallélisation.SQL and Azure Synapse Analytics outputs have an option for parallelization. La configuration de PartitionKey pour Event Hub doit correspondre au champ PARTITION BY (généralement PartitionId).Event Hub needs to have the PartitionKey configuration set to match with the PARTITION BY field (usually PartitionId). Pour Event Hub, assurez-vous également que le nombre de partitions d’entrée est égal au nombre de partitions de sortie pour éviter tout croisement entre les partitions.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. Exécutez votre requête avec 6 unités de streaming (ce qui est la capacité totale d’un seul nœud de calcul) pour mesurer le débit maximal réalisable et, si vous utilisez GROUP BY, pour mesurer le nombre de groupes (cardinalité) que le travail peut gérer.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. Les symptômes généraux qui indiquent que le travail a atteint les limites des ressources système sont les suivants.General symptoms of the job hitting system resource limits are the following.
    • La métrique % d’utilisation de SU est supérieure à 80 %.SU % utilization metric is over 80%. Cela indique une utilisation élevée de la mémoire.This indicates memory usage is high. Les facteurs qui contribuent à l’augmentation de cette métrique sont décrits ici.The factors contributing to the increase of this metric are described here.
    • L’horodatage de sortie est en retard par rapport au temps horloge.Output timestamp is falling behind with respect to wall clock time. Selon la logique de votre requête, l’horodatage de sortie peut présenter un décalage logique par rapport au temps horloge.Depending on your query logic, the output timestamp may have a logic offset from the wall clock time. Toutefois, ils doivent avancer à peu près à la même vitesse.However, they should progress at roughly the same rate. Si l’horodatage de sortie est de plus en plus en retard, cela indique que le système est surchargé.If the output timestamp is falling further and further behind, it’s an indicator that the system is overworking. Cela peut être le résultat de la limitation du récepteur de sortie en aval ou d’une utilisation élevée du processeur.It can be a result of downstream output sink throttling, or high CPU utilization. Comme nous ne fournissons pas de métrique d’utilisation du processeur à ce stade, il peut être difficile de différencier les deux.We don’t provide CPU utilization metric at this time, so it can be difficult to differentiate the two.
      • Si le problème est dû à une limitation du récepteur, vous devrez peut-être augmenter le nombre de partitions de sortie (et également de partitions d’entrée pour que le travail reste entièrement parallélisable), ou augmenter la quantité de ressources du récepteur (par exemple le nombre d’unités de requête pour 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).
    • Dans le diagramme de travail, il existe une métrique d’événement de backlog par partition pour chaque entrée.In job diagram, there is a per partition backlog event metric for each input. Si la métrique d’événement de backlog continue à augmenter, cela indique également que la ressource système est contrainte (en raison de la limitation du récepteur de sortie ou d’une utilisation élevée du processeur).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. Une fois que vous avez déterminé les limites d’un travail avec 6 unités de streaming, vous pouvez extrapoler linéairement la capacité de traitement du travail à mesure que vous ajoutez d’autres unités, en partant du principe que vous n’avez aucune asymétrie des données rendant une partition « sensible ».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."

Notes

Choisissez le nombre approprié d’unités de streaming : Comme Stream Analytics crée un nœud de traitement pour chaque ensemble de 6 unités de streaming ajouté, le nombre de nœuds doit être un diviseur du nombre de partitions d’entrée pour que les partitions puissent être réparties uniformément entre les nœuds.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. Par exemple, vous avez mesuré que votre travail avec 6 unités de streaming peut atteindre une vitesse de traitement de 4 Mo/s et le nombre de partitions d’entrée est 4.For example, you have measured your 6 SU job can achieve 4 MB/s processing rate, and your input partition count is 4. Vous pouvez choisir d’exécuter votre travail avec 12 unités de streaming pour atteindre une vitesse de traitement d’environ 8 Mo/s, ou 24 unités de streaming pour atteindre 16 Mo/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. Vous pouvez alors décider quand augmenter le nombre d’unités de streaming du travail jusqu’à quelle valeur, en fonction de votre vitesse d’entrée.You can then decide when to increase SU number for the job to what value, as a function of your input rate.

Cas 2 : Votre requête n’est pas massivement parallèle.Case 2 - If your query is not embarrassingly parallel.

Si votre requête n’est pas massivement parallèle, vous pouvez suivre les étapes ci-dessous.If your query is not embarrassingly parallel, you can follow the following steps.

  1. Démarrez avec une requête sans mot clé PARTITION BY tout d’abord afin d’éviter la complexité de partitionnement et exécutez-la avec 6 unités de streaming pour mesurer la charge maximale, comme dans le cas 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. Si vous pouvez obtenir votre charge prévue en termes de débit, vous avez terminé.If you can achieve your anticipated load in term of throughput, you are done. Vous pouvez également choisir de mesurer le même travail exécuté avec 3 unités de streaming et 1 unité de streaming, pour déterminer le nombre minimal d’unités de streaming qui fonctionne pour votre scénario.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. Si vous ne pouvez pas obtenir le débit souhaité, essayez de diviser votre requête en plusieurs étapes, si possible et si elle n’est pas déjà constituée de plusieurs étapes, et allouez jusqu’à 6 unités de streaming pour chaque étape de la requête.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. Par exemple, si vous avez 3 étapes, allouez 18 unités de streaming dans l’option « Échelle ».For example if you have 3 steps, allocate 18 SU in the "Scale" option.
  4. Lors de l’exécution d’un tel travail, Stream Analytics place chaque étape sur son propre nœud avec des ressources de 6 unités de streaming dédiées.When running such a job, Stream Analytics puts each step on its own node with dedicated 6 SU resources.
  5. Si vous n’avez pas encore atteint votre cible de charge, vous pouvez essayer d’utiliser PARTITION BY en commençant par les étapes les plus proches de l’entrée.If you still haven’t achieved your load target, you can attempt to use PARTITION BY starting from steps closer to the input. Pour l’opérateur GROUP BY qui n’est peut-être pas naturellement configurable en partition, vous pouvez utiliser le modèle d’agrégation global/local pour effectuer une opération GROUP BY partitionnée suivie d’une opération GROUP BY non partitionnée.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. Par exemple, vous souhaitez compter le nombre de voitures qui passent par chaque gare de péage toutes les 3 minutes et le volume des données dépasse ce qui peut être géré par 6 unités de streaming.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.

Requête :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

Dans la requête ci-dessus, vous comptez les voitures par gare de péage par partition, puis additionnez le nombre de toutes les partitions.In the query above, you are counting cars per toll booth per partition, and then adding the count from all partitions together.

Une fois le partitionnement effectué, pour chaque partition de l’étape, allouez jusqu’à 6 unités de streaming, chaque partition avec 6 unités de streaming représentant le maximum, pour pouvoir placer chaque partition sur son propre nœud de traitement.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.

Notes

Si votre requête ne peut pas être partitionnée, l’ajout d’unités de streaming supplémentaires dans une requête en plusieurs étapes peut ne pas toujours améliorer le débit.If your query cannot be partitioned, adding additional SU in a multi-steps query may not always improve throughput. Une façon d’augmenter les performances consiste à réduire le volume sur les étapes initiales à l’aide du modèle d’agrégation global/local, comme décrit ci-dessus à l’étape 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.

Cas 3 : Vous exécutez un grand nombre de requêtes indépendantes dans un travail.Case 3 - You are running lots of independent queries in a job.

Pour certains cas d’usage d’éditeurs de logiciels indépendants, où il est plus rentable de traiter les données de plusieurs locataires dans un même travail, vous risquez de finir par exécuter un certain nombre (par exemple 20) de requêtes indépendantes dans un seul travail en utilisant des entrées et sorties distinctes pour chaque locataire.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. L’hypothèse est que la charge de chaque sous-requête de ce type est relativement faible.The assumption is each such subquery’s load is relatively small. Dans ce cas, vous pouvez suivre les étapes ci-dessous.In this case, you can follow the following steps.

  1. Dans ce cas, n’utilisez pas PARTITION BY dans la requêteIn this case, do not use PARTITION BY in the query
  2. Réduisez le nombre de partitions d’entrée à la valeur la plus faible possible de 2 si vous utilisez Event Hub.Reduce the input partition count to the lowest possible value of 2 if you are using Event Hub.
  3. Exécutez la requête avec 6 unités de streaming.Run the query with 6 SU. Avec la charge attendue pour chaque sous-requête, ajoutez autant de ces sous-requêtes que possible, jusqu’à ce que le travail atteigne les limites des ressources système.With expected load for each subquery, add as many such subqueries as possible, until the job is hitting system resource limits. Reportez-vous au cas 1 pour connaître les symptômes de cette situation.Refer to Case 1 for the symptoms when this happens.
  4. Une fois que vous atteignez la limite des sous-requêtes mesurée ci-dessus, commencez à ajouter la sous-requête à un nouveau travail.Once you are hitting the subquery limit measured above, start adding the subquery to a new job. Le nombre de travaux à exécuter en fonction du nombre de requêtes indépendantes doit être assez linéaire, en partant du principe que vous n’avez aucune asymétrie de charge.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. Vous pouvez ensuite prévoir combien de travaux avec 6 unités de streaming vous devez exécuter en fonction du nombre de locataires que vous souhaitez traiter.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. Si vous utilisez une jointure de données de référence avec de telles requêtes, vous devez unir les entrées avant la jointure avec les mêmes données de référence.When using reference data join with such queries, union the inputs together before joining with the same reference data. Ensuite, fractionnez les événements si nécessaire.Then, split out the events if necessary. Dans le cas contraire, chaque jointure des données de référence conserve une copie des données de référence en mémoire, ce qui risque d’augmenter l’utilisation de la mémoire inutilement.Otherwise, each reference data join keeps a copy of reference data in memory, likely blowing up the memory usage unnecessarily.

Notes

Combien de locataires à placer dans chaque travail ?How many tenants to put in each job? Ce modèle de requête comporte souvent un grand nombre de sous-requêtes et aboutit à une topologie très volumineuse et complexe.This query pattern often has a large number of subqueries, and results in very large and complex topology. Le contrôleur du travail peut ne pas être en mesure de gérer une topologie si volumineuse.The controller of the job may not be able to handle such a large topology. En règle générale, restez en dessous de 40 locataires pour un travail avec 1 unité de streaming, et 60 locataires pour des travaux avec 3 et 6 unités de streaming.As a rule of thumb, stay under 40 tenants for 1 SU job, and 60 tenants for 3 SU and 6 SU jobs. Quand vous dépassez la capacité du contrôleur, le travail ne démarre pas correctement.When you are exceeding the capacity of the controller, the job will not start successfully.

Obtenir de l’aideGet help

Pour obtenir de l’aide supplémentaire, essayez notre page de questions Microsoft Q&A pour Azure Stream Analytics.For further assistance, try our Microsoft Q&A question page for Azure Stream Analytics.

Étapes suivantesNext steps