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.
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
etspark.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 .
En dehors des réponses ci-dessus. La taille du lot est le produit de 3 paramètres
batchDuration
: intervalle de temps pendant lequel les données en continu seront divisées en lots (en secondes).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.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 )
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