Ciao a tutti. Amici, condividiamo con voi la traduzione di un articolo, preparata appositamente per gli studenti del corso . Andiamo!

Apache Beam e DataFlow per pipeline in tempo reale
Il post di oggi si basa su un compito che ho recentemente svolto al lavoro. Ero davvero entusiasta di realizzarlo e di descrivere il lavoro svolto in formato blog, poiché mi ha permesso di dedicarmi all'ingegneria dei dati e di fare qualcosa che sarebbe stato molto utile per il mio team. Qualche tempo fa, ho scoperto che nei nostri sistemi è archiviato un notevole log utente relativo a uno dei nostri prodotti per la gestione dei dati. Si è scoperto che nessuno stava utilizzando questi dati, quindi sono subito interessato a cosa potremmo scoprire se iniziassimo ad analizzarli regolarmente. Tuttavia, ci sono stati alcuni ostacoli. Il primo problema era che i dati erano conservati in molti file di testo diversi, che non erano accessibili per un'analisi immediata. Il secondo problema era che erano salvati in un sistema chiuso, quindi non potevo utilizzare nessuno dei miei strumenti preferiti per l'analisi dei dati.
Dovevo trovare un modo per semplificare l'accesso per noi e portare un valore aggiunto integrando questa fonte di dati nelle nostre soluzioni di interazione con gli utenti. Dopo aver riflettuto un po', ho deciso di costruire una pipeline per trasferire questi dati in un database cloud, così io e il mio team potevamo accedervi e iniziare a generare delle intuizioni. Dopo aver completato la specializzazione in Data Engineering su Coursera qualche tempo fa, ero entusiasta di usare alcuni strumenti del corso nel progetto.
Quindi, collocare i dati in un database cloud sembrava un modo ragionevole per risolvere il mio primo problema, ma cosa potevo fare riguardo al problema numero 2? Fortunatamente, c'era un modo per trasferire questi dati in un ambiente dove avrei potuto accedere a strumenti come Python e Google Cloud Platform (GCP). Tuttavia, era un processo lungo, quindi dovevo fare qualcosa che mi permettesse di continuare a sviluppare mentre aspettavo la conclusione del trasferimento dei dati. La soluzione a cui sono giunto è stata quella di creare dati fittizi utilizzando la libreria Faker in Python. Non avevo mai utilizzato questa libreria prima, ma ho capito subito quanto sia utile. Questo approccio mi ha permesso di iniziare a scrivere codice e testare il pipeline senza dati reali.
Detto ciò, in questo post spiegherò come ho costruito il pipeline descritto sopra, utilizzando alcune delle tecnologie disponibili in GCP. In particolare, utilizzerò Apache Beam (versione per Python), Dataflow, Pub/Sub e BigQuery per raccogliere log degli utenti, trasformare i dati e inviarli a un database per ulteriori analisi. Nel mio caso, avevo bisogno solo delle funzionalità batch di Beam, poiché i miei dati non arrivavano in tempo reale, quindi Pub/Sub non era necessario. Tuttavia, mi soffermerò sulla versione streaming, in quanto è quella con cui potresti trovarti ad avere a che fare nella pratica.
Introduzione a GCP e Apache Beam
La Google Cloud Platform offre una serie di strumenti davvero utili per l'elaborazione dei big data. Ecco alcuni degli strumenti che utilizzerò:
- — è un servizio di messaggistica che utilizza il modello Publish-Subscribe, il quale ci consente di ricevere dati in tempo reale.
- — è un servizio che semplifica la creazione di pipeline dati e risolve automaticamente compiti come il dimensionamento dell'infrastruttura, il che significa che possiamo concentrarci solo sulla scrittura del codice per la nostra pipeline.
- — è uno storage di dati cloud. Se hai familiarità con altri database SQL, non avrai difficoltà a comprendere BigQuery.
- Infine, utilizzeremo Apache Beam, concentrandoci sulla versione Python per creare la nostra pipeline. Questo strumento ci permetterà di costruire una pipeline per l'elaborazione in streaming o batch, che si integra con GCP. È particolarmente utile per l'elaborazione parallela e adatto a compiti di tipo estrazione, trasformazione e caricamento (ETL), quindi, se dobbiamo spostare dati da un luogo a un altro con trasformazioni o calcoli, Beam è una buona scelta.
Esiste una vasta gamma di strumenti disponibili su GCP, quindi può essere difficile tenerli sotto controllo e comprendere il loro scopo, ma ecco un riepilogo per riferimento.
In GCP sono disponibili molti strumenti, quindi può essere difficile coprire tutto, compreso il loro scopo, ma comunque una sintesi per riferimento.
Visualizzazione del nostro pipeline
Visualizziamo i componenti del nostro pipeline in Figura 1. A un livello alto, vogliamo raccogliere i dati degli utenti in tempo reale, elaborarli e inviarli a BigQuery. I log vengono generati quando gli utenti interagiscono con il prodotto, inviando richieste al server, che vengono quindi registrate. Questi dati possono essere particolarmente utili per comprendere come gli utenti interagiscono con il nostro prodotto e se funzionano correttamente. In generale, il pipeline conterrà le seguenti fasi:
Beam rende questo processo molto semplice, indipendentemente dal fatto che abbiamo una fonte di dati in streaming o un file CSV, e vogliamo eseguire l'elaborazione batch. Più avanti vedrete che nel codice ci sono solo le minime modifiche necessarie per passare da uno all'altro. Questo è uno dei vantaggi dell'utilizzo di Beam.

Figura 1: Pipeline di dati principale: Fonte:
Creazione di dati pseudocasuali con Faker
Come già accennato in precedenza, a causa dell'accesso limitato ai dati ho deciso di creare dati fittizi nello stesso formato degli effettivi. È stata davvero un'esperienza utile, poiché ho potuto scrivere codice e testare il pipeline mentre aspettavo i dati. Ti propongo di dare un'occhiata a Faker, se vuoi scoprire cosa può offrire ulteriormente questa libreria. I nostri dati personalizzati saranno generalmente simili all'esempio sottostante. Basandoci su questo formato, possiamo generare dati riga per riga per simulare dati in tempo reale. Questi log forniscono informazioni come data, tipo di richiesta, risposta del server, indirizzo IP, ecc.
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"
Basandoci sulla riga sopra, vogliamo creare la nostra variabile LINE, usando 7 variabili nelle parentesi graffe qui sotto. Useremo anche questi come nomi di variabili nel nostro schema delle tabelle poco dopo.
LINE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""
Se avessimo fatto un'elaborazione in batch, il codice sarebbe stato molto simile, sebbene avremmo dovuto creare un insieme di campioni in un certo intervallo di tempo. Per utilizzare Faker, creiamo semplicemente un oggetto e chiamiamo i metodi di cui abbiamo bisogno. In particolare, Faker è stato utile per generare indirizzi IP e siti web. Ho utilizzato i seguenti metodi:
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
LINE = """
{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 = LINE.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_lineFine della prima parte.
Nei prossimi giorni condivideremo con voi il seguito dell'articolo, ma ora aspettiamo tradizionalmente i vostri commenti ;-).
Fonte: habr.com
