Comment résoudre les problèmes d'une application KCL bloquée ou bloquée pour Kinesis Data Streams ?

Dernière mise à jour : 06/05/2020

Mon application Amazon Kinesis Client Library (KCL) est bloquée et ne peut pas traiter d'enregistrements Amazon Kinesis Data Streams. Comment résoudre ce problème ?

Brève description

L'application KCL peut être bloquée pour les raisons suivantes :

  • Le processeur d'enregistrements (méthode implémentée par l'utilisateur) effectue une opération de blocage ou prend plus de temps que la normale.
  • Aucun enregistrement de données n'est placé dans la partition.
  • La KCL reste bloquée lors de la récupération d'un enregistrement.
  • La KCL n'est pas en mesure de planifier le traitement ou ne parvient pas au point de contrôle.

Vous pouvez détecter et résoudre les problèmes liés à la KCL en procédant comme suit :

  • Analysez les métriques KCL.
  • Analysez la table Amazon DynamoDB pour l'application KCL.
  • Vérifiez les configurations KCL.
  • Activez les journaux d'avertissement KCL.
  • Activez les journaux de débogage KCL.

Solution

Analyser les métriques KCL

Surveillez la métrique RecordProcessor.processRecords.Time et vérifiez si le temps nécessaire par la méthode processRecords du processeur d'enregistrements est supérieur à 60 secondes. Si votre méthode processRecords est bloquée, la KCL doit attendre. Une fois que votre processeur d'enregistrements a terminé sa tâche, essayez d'optimiser votre méthode processRecords .

Vérifier les configurations KCL

Vérifiez le nombre de flottes KCL et notez le nombre de partitions dans le flux de données Kinesis. Si le nombre de partitions est augmenté, augmentez le paramètre maxLeasesPerWorker en fonction du nombre de partitions dans la KCL.

Analyser la table DynamoDB pour l'application KCL

Chaque application KCL crée une table DynamoDB portant le même nom que l'application KCL pour suivre l'état de l'application. Pour dépanner l'application KCL, analysez les colonnes de la table DynamoDB.

Si la colonne de point de contrôle de la table n'est pas mise à jour, la logique de méthode processRecords est bloquée. Si les colonnes checkpoint et leaseCounter ne sont pas mises à jour, le paramètre maxLeasesPerWorker = 1 empêche les autres exécuteurs d'accepter le bail. Pour débloquer la méthode processRecords , augmentez la valeur du paramètre.

Activer les journaux Advanced KCL Warning

Pour vérifier si le processeur d'enregistrements est bloqué, définissez la valeur logWarningForTaskAfterMillis pour la configuration KCL sur millisecondes. La KCL attend ensuite qu'un processeur d'enregistrements se termine avant d'envoyer un message d'avertissement au journal concernant le temps de traitement. Si des messages d'avertissement sont consignés, la capture de vidages successifs de pile à partir de la JVM peut vous aider à découvrir ce qui est bloqué. Vous pouvez utiliser la commande jstack pour capturer n'importe quel suivi de pile.

Pour plus d'informations sur la valeur logWarningForTaskAfterMillis consultez Amazon Web Services - Labs dans GitHub.

Activer les journaux de débogage KCL

Vous pouvez activer les journaux de débogage de la KCL pour identifier les problèmes qui ont entraîné l'arrêt de la consommation des données provenant de Kinesis Data Streams. Il est également recommandé de redémarrer l'application KCL pour effacer tout autre problème d'application.

Si vous avez redémarré la KCL et qu'elle reste bloquée, un problème peut survenir suite au transfert de la propriété de la partition. Cela entraîne également un problème où la KCL ne dispose pas des journaux pour les données que vous essayez de reproduire. Vous pouvez résoudre ce problème en activant la fonction de journalisation sur le parc KCL.

Pour activer les journaux, effectuez les opérations suivantes :

1.    Choisissez un enregistreur d'événements.

2.    Créez un fichier log4.properties dans le dossier src/main/resources pour rediriger les messages de journal vers la console :

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.logger.httpclient.wire=DEBUG

Remarque: dans cet exemple, nous utilisons log4j pour déboguer les journaux en Java.

3.    Redirigez les messages de journal vers un fichier journal :

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/Users/harshdev/Desktop/logfolder/    <== Give the log location where you want to create log files
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.rootLogger=DEBUG, stdout, file

4.    Incluez la dépendance log4j dans votre fichier POM :

<dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
</dependency>