Hej alla. VÀnner, vi delar med oss av översÀttningen av artikeln som Àr speciellt förberedd för studenter pÄ kursen . LÄt oss köra!

Apache Beam och DataFlow för realtidsrörledningar
Dagens inlÀgg Àr baserat pÄ en uppgift som jag nyligen arbetade med pÄ jobbet. Jag var verkligen glad över att fÄ genomföra den och beskriva det arbete jag gjort i form av ett blogginlÀgg, eftersom det gav mig möjlighet att fÄ arbeta med dataengineering samt att göra nÄgot som skulle vara mycket vÀrdefullt för mitt team. Inte sÄ lÀnge sedan upptÀckte jag att vÄra system hade en ganska stor logg av anvÀndardata relaterade till en av vÄra produkter för databehandling. Det visade sig att ingen hade anvÀnt dessa data, sÄ jag blev direkt intresserad av vad vi skulle kunna lÀra oss om vi började analysera dem regelbundet. Men det fanns nÄgra problem pÄ vÀgen. Det första problemet var att datan var lagrad i mÄnga olika textfiler som inte var tillgÀngliga för omedelbar analys. Det andra problemet var att de var sparade i ett stÀngt system, vilket innebar att jag inte kunde anvÀnda nÄgot av mina favoritverktyg för dataanalys.
Jag stod inför utmaningen att hitta ett sÀtt att göra Ätkomsten enklare för oss och ge nÄgon form av vÀrde genom att integrera denna datakÀlla i nÄgra av vÄra anvÀndarinteraktionslösningar. Efter att ha funderat ett tag beslöt jag mig för att konstruera en pipeline för att överföra dessa data till en molndatabas sÄ att jag och mitt team skulle kunna fÄ tillgÄng till dem och börja dra nÄgra slutsatser. Efter att jag avslutat min specialisering i Data Engineering pÄ Coursera för ett tag sedan, var jag ivrig att anvÀnda nÄgra verktyg frÄn kursen i projektet.
DÀrför verkade lagring av data i en molndatabas vara en rimlig lösning pÄ mitt första problem, men vad skulle jag göra med problem nummer 2? Lyckligtvis fanns det ett sÀtt att flytta dessa data till en miljö dÀr jag kunde fÄ tillgÄng till verktyg som Python och Google Cloud Platform (GCP). Men detta var en lÄng process, sÄ jag behövde göra nÄgot som gjorde att jag kunde fortsÀtta utvecklingen medan jag vÀntade pÄ att datatransfereringen skulle slutföras. Lösningen jag kom fram till var att skapa falska data med hjÀlp av biblioteket Faker i Python. Jag hade aldrig anvÀnt detta bibliotek tidigare, men insÄg snabbt hur anvÀndbart det var. Genom att anvÀnda denna metod kunde jag börja skriva kod och testa pipeline utan faktiska data.
Med det sagt, i detta inlÀgg kommer jag att berÀtta hur jag byggde den pipeline som beskrivits ovan, med hjÀlp av nÄgra av de teknologier som Àr tillgÀngliga i GCP. Specifikt kommer jag att anvÀnda Apache Beam (Python-versionen), Dataflow, Pub/Sub och BigQuery för att samla anvÀndarloggar, transformera data och överföra dem till en databas för vidare analys. I mitt fall behövde jag bara den batchfunktionalitet som Beam erbjuder, eftersom mina data inte kom i realtid, sÄ Pub/Sub var inte nödvÀndigt. Men jag kommer att nÀmna den strömmande versionen, eftersom det Àr nÄgot ni kan stöta pÄ i praktiken.
Introduktion till GCP och Apache Beam
Google Cloud Platform erbjuder en uppsÀttning riktigt anvÀndbara verktyg för bearbetning av stordata. HÀr Àr nÄgra av de verktyg jag kommer att anvÀnda:
- Àr en meddelandetjÀnst som anvÀnder publikator-prenumerantmönstret (Publisher-Subscriber), vilket möjliggör för oss att ta emot data i realtid.
- Àr en tjÀnst som förenklar skapandet av datakanaler och automatiskt hanterar uppgifter som skalning av infrastruktur, vilket innebÀr att vi kan fokusera endast pÄ att skriva kod för vÄr pipeline.
- Àr en molndatabas. Om du Àr bekant med andra SQL-databaser kommer det inte ta lÄng tid att förstÄ BigQuery.
- Och slutligen kommer vi att anvÀnda Apache Beam, sÀrskilt fokusera pÄ Python-versionen för att skapa vÄr pipeline. Detta verktyg gör det möjligt för oss att skapa en pipeline för realtids- eller batchbearbetning som integreras med GCP. Det Àr sÀrskilt anvÀndbart för parallell bearbetning och passar för uppgifter av typen extraktion, transformation och laddning (ETL), sÄ om vi behöver flytta data frÄn en plats till en annan med transformationer eller berÀkningar, Àr Beam ett bra val.
Det finns en mÀngd olika verktyg tillgÀngliga pÄ GCP, vilket kan göra det svÄrt att hÄlla koll pÄ dem alla och vad deras syfte Àr, men hÀr Àr en sammanfattning av dem som referens.
Det finns mÄnga verktyg tillgÀngliga pÄ GCP, vilket kan göra det svÄrt att tÀcka allt, inklusive deras syften, men ÀndÄ en sammanfattning för referens.
Visualisering av vÄr pipeline
LÄt oss visualisera komponenterna i vÄr pipeline pÄ figur 1. PÄ en övergripande nivÄ vill vi samla in anvÀndardata i realtid, bearbeta dem och skicka dem till BigQuery. Loggar genereras nÀr anvÀndare interagerar med produkten och skickar förfrÄgningar till servern, som sedan loggas. Dessa data kan vara sÀrskilt anvÀndbara för att förstÄ hur anvÀndare interagerar med vÄr produkt och om den fungerar som den ska. Generellt sett kommer pipelinen att innehÄlla följande steg:
Beam gör denna process mycket enkel, oavsett om vi har en strömmande datakÀlla eller en CSV-fil och vill göra batchbehandling. Senare ser du att det bara finns minimala Àndringar i koden som behövs för att vÀxla mellan dem. Detta Àr en av fördelarna med att anvÀnda Beam.

Figur 1: Huvudpipeline för data: KÀlla:
Skapa pseudodata med hjÀlp av Faker
Som jag nÀmnde tidigare, pÄ grund av begrÀnsad tillgÄng till data, bestÀmde jag mig för att skapa pseudodata i samma format som de faktiska. Det var verkligen en anvÀndbar övning, eftersom jag kunde skriva kod och testa pipelinen medan jag vÀntade pÄ data. LÄt oss ta en titt pÄ Faker, om du vill veta vad mer detta bibliotek kan erbjuda. VÄra anvÀndardata kommer i stort att likna exemplet nedan. Baserat pÄ detta format kan vi generera data rad för rad för att simulera data i realtid. Dessa loggar ger oss information som datum, typ av förfrÄgan, svar frÄn servern, IP-adress osv.
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"
Baserat pÄ raden ovan vill vi skapa vÄr variabel LINE, med hjÀlp av 7 variabler i klamrar nedan. Vi kommer ocksÄ att anvÀnda dem som variabelnamn i vÄrt tabellschema lite senare.
LINE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""
Om vi skulle göra batchbearbetning skulle koden se mycket liknande ut, Àven om vi skulle behöva skapa en uppsÀttning prover inom ett visst tidsintervall. För att anvÀnda Faker skapar vi helt enkelt ett objekt och anropar de metoder vi behöver. I synnerhet har Faker varit anvÀndbar för att skapa IP-adresser och webbplatser. Jag anvÀnde följande metoder:
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_lineSlutet av första delen.
Under de kommande dagarna kommer vi att dela med oss av fortsÀttningen av artikeln, och just nu ser vi traditionellt fram emot kommentarer ;-).
KĂ€lla: habr.com
