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.
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.
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?
Les principaux problèmes que je vois avec cette solution sont:
Je dirais que la solution doit faire: lire à partir de Kafka stream -> UDF -> tronçon de route groupby -> average -> écrire à Kafka stream.
Ma conception dépendrait de
Si je veux évoluer pour un certain nombre de comptes, la conception ressemblerait à ceci
Croiser les inquiétudes sur cette conception -
Quelques améliorations pratiques possibles sur cette conception -