web-dev-qa-db-fra.com

Limiter la taille des lots Kafka lors de l'utilisation de Spark Streaming

Est-il possible de limiter la taille des lots renvoyés par le consommateur Kafka pour Spark Streaming?

Je pose la question parce que le premier lot que je reçois contient des centaines de millions d’enregistrements et qu’il faut beaucoup de temps pour les traiter et les contrôler.

11
Samy Dindane

Je pense que votre problème peut être résolu en Spark Streaming Backpressure.

Vérifiez spark.streaming.backpressure.enabled et spark.streaming.backpressure.initialRate.

Par défaut, spark.streaming.backpressure.initialRate est non défini et spark.streaming.backpressure.enabled est disabled par défaut, donc je suppose que spark le prendra autant que possible.

De Configuration d'Apache Spark Kafka

spark.streaming.backpressure.enabled:

Cela permet à Spark Streaming de contrôler le taux de réception en fonction sur les retards de planification et les temps de traitement actuels des lots, de sorte que le système ne reçoit que le temps nécessaire au traitement . En interne, cela définit de manière dynamique le taux de réception maximal de récepteurs. Ce taux est limité par les valeurs spark.streaming.receiver.maxRate et spark.streaming.kafka.maxRatePerPartition si elles sont définies (voir ci-dessous).

Et puisque vous voulez contrôler le premier lot, ou pour être plus précis - nombre de messages dans le premier lot, je pense que vous avez besoin de spark.streaming.backpressure.initialRate

spark.streaming.backpressure.initialRate:

Il s'agit du débit de réception maximal initial auquel chaque récepteur sera affecté recevoir des données pour le premier lot lorsque le mécanisme de contre-pression est activée.

Celui-ci est utile lorsque votre travail Spark (respectivement les employés de Spark) est en mesure de traiter 10000 messages de kafka, mais que les courtiers de kafka donnent à votre travail 100 000 messages. 

Peut-être serez-vous également intéressé à consulter spark.streaming.kafka.maxRatePerPartition ainsi que des recherches et des suggestions concernant ces propriétés, par exemple par Jeroen van Wilgenburg sur son blog .

22
VladoDemcak

En dehors des réponses ci-dessus. La taille du lot est le produit de 3 paramètres

  1. batchDuration: intervalle de temps pendant lequel les données en continu seront divisées en lots (en secondes).
  2. spark.streaming.kafka.maxRatePerPartition: définissez le nombre maximal de messages par partition par seconde. Ceci, lorsqu'il est combiné avec batchDuration, contrôlera la taille du lot. Vous voulez que maxRatePerPartition soit défini, et large (sinon, vous limitez effectivement votre travail) et batchDuration soit très petit.
  3. Nombre de partitions dans le sujet kafka

Pour une meilleure explication du fonctionnement de ce produit lors de l'activation/désactivation de la contre-pression ( set spark.streaming.kafka.maxRatePerPartition pour createDirectStream )

4
Vikki

Limiter la taille maximale du lot aidera grandement à contrôler le temps de traitement, mais augmentera le temps de latence du traitement du message.

Avec les paramètres situés sous les propriétés, nous pouvons contrôler la taille du lot Spark.streaming.receiver.maxRate = Spark.streaming.kafka.maxRatePerPartition =

Vous pouvez même définir dynamiquement la taille du lot en fonction du temps de traitement en activant la contre-pression Spark.streaming.backpressure.enabled: true

0
Jignesh