Créons un pipeline de traitement en continu. Partie 1

Bonjour à tous. Amis, nous partageons avec vous la traduction d'un article, préparée spécialement pour les étudiants du cours «Ingénieur en données». Allons-y !

Créons un pipeline de traitement en continu. Partie 1

Apache Beam et DataFlow pour des pipelines en temps réel

Le post d'aujourd'hui est basé sur une tùche sur laquelle j'ai récemment travaillé. J'étais vraiment heureux de la réaliser et de décrire le travail effectué sous forme de billet de blog, car cela m'a donné l'occasion de m'exercer au data engineering et aussi de faire quelque chose qui serait trÚs utile pour mon équipe. Il n'y a pas si longtemps, j'ai découvert que nos systÚmes contenaient un nombre assez important de journaux d'utilisateurs liés à l'un de nos produits de traitement de données. Il s'est avéré que personne n'utilisait ces données, donc je me suis tout de suite intéressé à ce que nous pourrions apprendre si nous commencions à les analyser réguliÚrement. Cependant, il y avait quelques problÚmes en chemin. Le premier problÚme était que les données étaient stockées dans plusieurs fichiers texte différents, qui n'étaient pas accessibles pour une analyse instantanée. Le deuxiÚme problÚme était qu'elles étaient enregistrées dans un systÚme fermé, donc je ne pouvais pas utiliser aucun de mes outils préférés pour l'analyse de données.

Je devais déterminer comment faciliter l'accÚs pour nous et apporter une certaine valeur en intégrant cette source de données dans certaines de nos solutions d'interaction avec les utilisateurs. AprÚs avoir réfléchi un moment, j'ai décidé de construire un pipeline pour transférer ces données dans une base de données cloud, afin que mon équipe et moi puissions y accéder et commencer à générer des conclusions. AprÚs avoir terminé ma spécialisation en Data Engineering sur Coursera il y a quelque temps, j'étais impatient d'utiliser certains outils du cours dans le projet.

Ainsi, le stockage des donnĂ©es dans une base de donnĂ©es cloud semblait ĂȘtre une solution raisonnable Ă  mon premier problĂšme, mais que pouvais-je faire avec le problĂšme numĂ©ro 2 ? Heureusement, il y avait un moyen de transfĂ©rer ces donnĂ©es dans un environnement oĂč je pouvais accĂ©der Ă  des outils comme Python et Google Cloud Platform (GCP). Cependant, c'Ă©tait un processus long, donc je devais faire quelque chose qui me permettrait de continuer le dĂ©veloppement pendant que j'attendais que le transfert de donnĂ©es soit terminĂ©. La solution Ă  laquelle je suis parvenu consistait Ă  crĂ©er des donnĂ©es fictives Ă  l'aide de la bibliothĂšque Faker en Python. Je n'avais jamais utilisĂ© cette bibliothĂšque auparavant, mais j'ai rapidement compris Ă  quel point elle Ă©tait utile. L'utilisation de cette approche m'a permis de commencer Ă  Ă©crire du code et Ă  tester le pipeline sans donnĂ©es rĂ©elles.

Ceci dit, dans ce post, je vais expliquer comment j'ai construit le pipeline dĂ©crit ci-dessus en utilisant certaines des technologies disponibles dans GCP. En particulier, je vais utiliser Apache Beam (version Python), Dataflow, Pub/Sub et BigQuery pour collecter des journaux utilisateur, transformer les donnĂ©es et les transfĂ©rer dans une base de donnĂ©es pour une analyse ultĂ©rieure. Dans mon cas, j'avais uniquement besoin de la fonctionnalitĂ© par lots de Beam, car mes donnĂ©es ne provenaient pas en temps rĂ©el, donc Pub/Sub n'Ă©tait pas nĂ©cessaire. Cependant, je vais m'arrĂȘter sur la version en streaming, car c'est quelque chose que vous pourriez rencontrer dans la pratique.

Introduction Ă  GCP et Apache Beam

Google Cloud Platform fournit un ensemble d'outils vraiment utiles pour le traitement des Big Data. Voici quelques-uns des outils que je vais utiliser :

  • Pub/Sub est un service de messagerie utilisant le modĂšle Éditeur-AbonnĂ© (Publisher-Subscriber), qui nous permet de recevoir des donnĂ©es en temps rĂ©el.
  • DataFlow est un service qui simplifie la crĂ©ation de pipelines de donnĂ©es et rĂ©sout automatiquement des tĂąches telles que la mise Ă  l'Ă©chelle de l'infrastructure, ce qui signifie que nous pouvons nous concentrer uniquement sur l'Ă©criture du code pour notre pipeline.
  • BigQuery est un stockage de donnĂ©es cloud. Si vous ĂȘtes familier avec d'autres bases de donnĂ©es SQL, vous ne mettrez pas longtemps Ă  comprendre BigQuery.
  • Et enfin, nous utiliserons Apache Beam, en nous concentrant spĂ©cifiquement sur la version Python pour crĂ©er notre pipeline. Cet outil nous permettra de crĂ©er un pipeline de traitement en temps rĂ©el ou par lots, qui s'intĂšgre Ă  GCP. Il est particuliĂšrement utile pour le traitement parallĂšle et convient aux tĂąches de type extraction, transformation et chargement (ETL), donc si nous avons besoin de dĂ©placer des donnĂ©es d'un endroit Ă  un autre tout en effectuant des transformations ou des calculs, Beam est un bon choix.

Il existe une grande variĂ©tĂ© d'outils disponibles sur GCP, il peut donc ĂȘtre difficile de tous les retracer et de comprendre leur but, mais voici un rĂ©sumĂ© Ă  titre de rĂ©fĂ©rence.
Il y a un grand nombre d'outils disponibles sur GCP, donc il peut ĂȘtre complexe de les couvrir tous, y compris leur usage, nĂ©anmoins voici un rĂ©sumĂ© pour rĂ©fĂ©rence.

Visualisation de notre pipeline

Visualisons les composants de notre pipeline dans l'illustration 1. Dans l'ensemble, nous souhaitons collecter les donnĂ©es des utilisateurs en temps rĂ©el, les traiter et les envoyer dans BigQuery. Des journaux sont créés lorsque les utilisateurs interagissent avec le produit, en envoyant des requĂȘtes au serveur qui sont alors enregistrĂ©es. Ces donnĂ©es peuvent ĂȘtre particuliĂšrement utiles pour comprendre comment les utilisateurs interagissent avec notre produit et s'il fonctionne comme prĂ©vu. En gĂ©nĂ©ral, le pipeline comprendra les Ă©tapes suivantes :

Beam facilite énormément ce processus, que nous ayons une source de données en streaming ou un fichier CSV, et que nous souhaitions effectuer un traitement par lots. Vous verrez plus tard que le code nécessite seulement des modifications minimales pour passer d'un mode à l'autre. C'est l'un des avantages de l'utilisation de Beam.

Créons un pipeline de traitement en continu. Partie 1
Illustration 1 : Pipeline des données principal : Source :

Génération de données fictives avec Faker

Comme je l'ai mentionnĂ© prĂ©cĂ©demment, en raison d'un accĂšs limitĂ© aux donnĂ©es, j'ai dĂ©cidĂ© de crĂ©er des donnĂ©es fictives dans le mĂȘme format que les rĂ©elles. C'Ă©tait un exercice vraiment utile, car je pouvais Ă©crire du code et tester le pipeline pendant que j'attendais les donnĂ©es. Je vous propose de jeter un Ɠil Ă  documentation Faker, si vous souhaitez dĂ©couvrir ce que cette bibliothĂšque peut encore offrir. Nos donnĂ©es utilisateurs seront gĂ©nĂ©ralement similaires Ă  l'exemple ci-dessous. Sur la base de ce format, nous pouvons gĂ©nĂ©rer des donnĂ©es ligne par ligne pour simuler des donnĂ©es en temps rĂ©el. Ces journaux nous fournissent des informations telles que la date, le type de demande, la rĂ©ponse du serveur, l'adresse IP, etc.

192.52.197.161 - - [30/Apr/2019:21:11:42] "PUT /tag/category/tag HTTP/1.1" [401] 155 "https://harris-lopez.com/categories/about/" "Mozilla/5.0 (Macintosh; PPC Mac OS X 10_11_2) AppleWebKit/5312 (KHTML, like Gecko) Chrome/34.0.855.0 Safari/5312"

En nous basant sur la ligne ci-dessus, nous souhaitons créer notre variable LIGNE, en utilisant 7 variables dans les accolades ci-dessous. Nous allons également les utiliser comme noms de variables dans notre schéma de table un peu plus tard.

LIGNE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""

Si nous effectuions un traitement par lots, le code serait trÚs similaire, bien que nous devrions créer un ensemble d'échantillons dans une certaine plage de temps. Pour utiliser Faker, nous créons simplement un objet et appelons les méthodes dont nous avons besoin. En particulier, Faker a été utile pour créer des adresses IP ainsi que des sites Web. J'ai utilisé les méthodes suivantes :

fake.ipv4()
fake.uri_path()
fake.uri()
fake.user_agent()

from faker import Faker
import time
import random
import os
import numpy as np
from datetime import datetime, timedelta



LIGNE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""


def generate_log_line():
    fake = Faker()
    now = datetime.now()
    remote_addr = fake.ipv4()
    time_local = now.strftime('%d/%b/%Y:%H:%M:%S')
    request_type = random.choice(["GET", "POST", "PUT"])
    request_path = "/" + fake.uri_path()

    status = np.random.choice([200, 401, 404], p=[0.9, 0.05, 0.05])
    body_bytes_sent = random.choice(range(5, 1000, 1))
    http_referer = fake.uri()
    http_user_agent = fake.user_agent()

    log_line = LIGNE.format(
        remote_addr=remote_addr,
        time_local=time_local,
        request_type=request_type,
        request_path=request_path,
        status=status,
        body_bytes_sent=body_bytes_sent,
        http_referer=http_referer,
        http_user_agent=http_user_agent
    )

    return log_line

Fin de la premiĂšre partie.

Nous partagerons avec vous la suite de l'article dans les prochains jours, et en attendant, nous attendons vos commentaires ;-).

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster