2 votes

Plusieurs consommateurs traitant exactement une fois avec Apache Spark Streaming

Je cherche à traiter des éléments dans une file d'attente (Kafka ou Amazon Kinesis) et à effectuer plusieurs opérations sur chaque élément, par exemple :

  • Écrire cela dans un cluster HDFS
  • Appeler une API REST
  • Déclencher une notification sur Slack.

Pour chacune de ces opérations, je m'attends à une sémantique de "exactement une fois", est-ce réalisable dans Apache Spark et comment ?

1voto

javadba Points 2430

Vous devrez gérer manuellement les clés uniques : mais avec cette approche, il est possible lors de l'utilisation de

KafkaUtils.createDirectStream

À partir de la documentation de Spark http://spark.apache.org/docs/latest/streaming-kafka-integration.html :

Approche 2 : Approche directe (sans récepteurs)

chaque enregistrement est reçu par Spark Streaming effectivement exactement une fois malgré les échecs.

Et voici l'exigence d'idempotence - par exemple, en sauvegardant une clé unique par message dans Postgres :

Afin d'atteindre des sémantiques exactement une fois pour la sortie de vos résultats, votre opération de sortie qui enregistre les données dans un entrepôt de données externe doit être soit idempotente, soit une transaction atomique qui enregistre les résultats et les décalages (voir Sémantique des opérations de sortie dans le guide de programmation principal pour plus d'informations).

Voici une idée du genre de code dont vous auriez besoin pour gérer les clés uniques (de http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/) :

 stream.foreachRDD { rdd =>
    rdd.foreachPartition { iter =>
    // assurez-vous que le pool de connexions est configuré sur l'exécuteur avant d'écrire
    SetupJdbc(jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword)

    iter.foreach { case (key, msg) =>
      DB.autoCommit { implicit session =>
        // la clé unique pour l'idempotence est simplement le texte du message lui-même, à titre d'exemple
        sql"insert into idem_data(msg) values (${msg})".update.apply
      }
    }
  }
}

Un identifiant unique par message devrait être géré.

0voto

Pranab Points 513

Exactement une fois est un effet secondaire du traitement au moins une fois sémantique, lorsque les opérations sont idempotentes. Dans votre cas, si les 3 opérations sont idempotentes, vous pouvez obtenir une sémantique exactement une fois. L'autre moyen d'obtenir une sémantique exactement une fois est d'envelopper les 3 opérations et le stockage de l'offset Kafka dans une transaction, ce qui n'est pas réalisable.

https://pkghosh.wordpress.com/2016/05/18/exactly-once-stream-processing-semantics-not-exactly/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X