web-dev-qa-db-fra.com

Calculer la vitesse moyenne des routes

Je suis allé à un entretien d'embauche d'ingénieur de données. L'enquêteur m'a posé une question. Il m'a donné une situation et m'a demandé de concevoir le flux de données pour ce système. J'ai résolu cela mais il n'a pas aimé ma solution et j'ai échoué. J'aimerais savoir si vous avez de meilleures idées pour résoudre ce défi.

La question était:

Notre système reçoit quatre flux de données. Les données contiennent un identifiant de véhicule, une vitesse et des coordonnées de géolocalisation. Chaque véhicule envoie ses données une fois par minute. Il n'y a aucun lien entre un flux spécifique et une route ou un véhicule spécifique ou autre chose. Il existe une fonction qui accepte les coordinations et renvoie un nom de section de route. Nous devons connaître la vitesse moyenne par tronçon de route toutes les 5 minutes. Enfin, nous voulons écrire les résultats à Kafka.

enter image description here

Donc ma solution était:

Tout d'abord, écrivez toutes les données dans un cluster Kafka, en un seul sujet, partitionné par les 5-6 premiers chiffres de la latitude concaténée aux 5-6 premiers chiffres de la longitude. Ensuite, lisez les données par Structured Streaming, en ajoutant pour chaque ligne le nom de la section de route par les coordinations (il y a un udf prédéfini pour cela), puis en recadrant les données par nom de section de route.

Parce que je partitionne les données en Kafka par les 5-6 premiers chiffres des coordinations, après avoir traduit les coordinations en nom de section, il n'est pas nécessaire de transférer beaucoup de données vers la partition correcte et donc Je peux profiter de l'opération colesce () qui ne déclenche pas un shuffle complet.

Calculer ensuite la vitesse moyenne par exécuteur.

L'ensemble du processus se produira toutes les 5 minutes et nous écrirons les données en mode ajout dans le récepteur final Kafka.

enter image description here

Encore une fois, l'intervieweur n'a pas aimé ma solution. Quelqu'un pourrait-il suggérer comment l'améliorer ou une idée complètement différente et meilleure?

21
Alon

Les principaux problèmes que je vois avec cette solution sont:

  • Les sections de route qui sont sur le bord des carrés à 6 chiffres de la carte auront des données dans plusieurs partitions de sujet et auront plusieurs vitesses moyennes.
  • La taille des données d'ingestion pour vos partitions Kafka peut être déséquilibrée (ville vs désert). Le partitionnement par les premiers chiffres de l'id de la voiture peut être une bonne idée IMO.
  • Je ne suis pas sûr d'avoir suivi la partie fusion, mais cela semble problématique.

Je dirais que la solution doit faire: lire à partir de Kafka stream -> UDF -> tronçon de route groupby -> average -> écrire à Kafka stream.

0
David Taub

Ma conception dépendrait de

  1. Nombre de routes
  2. Nombre de véhicules
  3. Coût de calcul de la route à partir des coordonnées

Si je veux évoluer pour un certain nombre de comptes, la conception ressemblerait à ceci enter image description here

Croiser les inquiétudes sur cette conception -

  1. Maintenir un état durable des flux d'entrée (si l'entrée est kafka, nous pouvons stocker des décalages avec Kafka ou en externe)
  2. Périodiquement les états des points de contrôle vers le système externe (je préfère utiliser barrières de point de contrôle asynchrones dans Flink )

Quelques améliorations pratiques possibles sur cette conception -

  1. Fonction de cartographie de la section de mise en cache de route si possible, basée sur les routes
  2. Gestion des pings manqués (en pratique, tous les ping ne sont pas disponibles)
  3. Prise en compte de la courbure de la route (prise en compte et altitude)
0
yugandhar