Tere, sÔbrad. Jagame teiega artikli tÔlget, mis on spetsiaalselt ette valmistatud kursuse tudengitele . Alustame!

Apache Beam ja DataFlow reaalaja töötluse jaoks
TĂ€nane postitus pĂ”hineb ĂŒlesandel, millega ma hiljuti tööl tegelesin. Olin tĂ”eliselt elevil, et sai selle ellu viia ja oma tööprotsessi kirja panna blogipostituse vormis, kuna see andis mulle vĂ”imaluse tegeleda andmeinseneeria valdkonnaga ning luua midagi, mis oleks minu meeskonnale tĂ”eliselt kasulik. Hiljuti avastasin, et meie sĂŒsteemides hoitakse ĂŒsna suurt kasutajate logi, mis on seotud ĂŒhe meie andmetöötlustootega. Selgus, et neid andmeid keegi ei kasutanud, seega huvitas mind kohe see, mida me vĂ”iksime Ă”ppida, kui hakkaksime neid regulaarselt analĂŒĂŒsima. Kuid teel olid mitmed probleemid. Esimene probleem oli see, et andmed olid salvestatud paljudesse erinevatesse tekstifailidesse, mis ei olnud kohe analĂŒĂŒsitavad. Teine probleem seisnes selles, et need olid salvestatud suletud sĂŒsteemis, mistĂ”ttu ei saanud ma kasutada ĂŒhtegi oma lemmikanalĂŒĂŒsi tööriista.
Pidin vÀlja mÔtlema, kuidas meie juurdepÀÀsu lihtsamaks muuta ja mingit vÀÀrtust lisada, integreerides selle andmeallika mÔnelle meie kasutajate suhtlemise lahendusele. PÀrast mÔningast mÔtlemist otsustasin ehitada toru, et edastada need andmed pilveandmebaasi, et mina ja mu meeskond saaksime neile juurde pÀÀseda ja hakata mingisuguseid jÀreldusi genereerima. PÀrast seda, kui lÔpetasin Data Engineeringi erialakursuse Courseras mÔni aeg tagasi, olin pÔnevil, et saaksin projektis kasutada kursuse tööriistu.
Seega tundus andmete paigutamine pilveandmebaasi mĂ”istlik viis minu esimese probleemi lahendamiseks, kuid mida ma saaksin teha teise probleemi osas? Ănneks oli vĂ”imalus neid andmeid viia keskkonda, kus ma saaksin kasutada selliseid tööriistu nagu Python ja Google Cloud Platform (GCP). Kuid see oli pikk protsess, seega pidin midagi vĂ€lja mĂ”tlema, mis lubaks mul edasi töötada, kuni andmete edastamine lĂ”ppes. Lahendus, millega ma vĂ€lja tulin, oli valeandmete loomine raamatukogu abil Faker Pythonis. Ma pole varem selle raamatukoguga töötanud, kuid mĂ”istsin kiiresti, kui kasulik see on. Selle lĂ€henemise kasutamine vĂ”imaldas mul alustada koodi kirjutamist ja katsetada juhtmehhanismi ilma tegelike andmeteta.
Arvestades juba öeldut, rÀÀgin selles postituses, kuidas ehitasin eelnevalt kirjeldatud juhtmehhanismi, kasutades mĂ”ningaid GCP-s saadaval olevaid tehnoloogiaid. EelkĂ”ige kasutan Apache Beam (Python versioon), Dataflow, Pub/Sub ja BigQuery kasutajate logide kogumiseks, andmete töötlemiseks ja nende edastamiseks andmebaasi edasiseks analĂŒĂŒsiks. Minu puhul vajas ainult pakettide funktsionaalsust Beam, kuna minu andmed ei tulnud reaalajas, seega Pub/Sub ei olnud vajalik. Siiski peatun voogedastuse versioonil, kuna see on see, millega vĂ”iksite praktikas kokku puutuda.
Sissejuhatus GCP-sse ja Apache Beam'i
Google Cloud Platform pakub suurepÀraseid tööriistu suurte andmete töötlemiseks. Siin on mÔned tööriistad, mida kasutan:
- â see on sĂ”numite vahetamise teenus, mis kasutab vĂ€ljaandja ja tellija (Publisher-Subscriber) mustrit, mis vĂ”imaldab meil saada andmeid reaalajas.
- â see on teenus, mis lihtsustab andmejuhtmete loomist ja lahendab automaatselt selliseid ĂŒlesandeid nagu infrastruktuuri skaalamine, mis tĂ€hendab, et saame keskenduda ainult koodi kirjutamisele meie juhtmehhanismiga.
- â see on pilveteenuste andmehoidla. Kui olete tuttav teiste SQL-baasidega, ei vĂ”ta BigQuerys kaua harjumine.
- Ja lĂ”puks, kasutame Apache Beam'i, nimelt keskendume Python versioonile meie juhtmehhanismi loomiseks. See tööriist vĂ”imaldab meil luua juhtmehhanisme voog- vĂ”i pakettide töötlemiseks, mis integreerub GCP-ga. See on eriti kasulik paralleelseks töötlemiseks ja sobib ETL (ekstraktsioon, transformatsioon ja laadimine) ĂŒlesannete jaoks, seega, kui peame andmeid ĂŒhest kohast teise liigutama koos transformatsioonide vĂ”i arvutustega, on Beam hea valik.
GCP-s on saadaval suur hulk tööriistu, nii et nende jÀlgimine ja eri otstarvete tÔlgendamine vÔib olla keeruline, kuid siin on nende kokkuvÔte referentsiks.
GCP-s on saadaval suur hulk tööriistu, seega vĂ”ib nende kĂ”igi katmine sealhulgas nende mÀÀratus olla keeruline, kuid siiski. lĂŒhikokkuvĂ”te viitamiseks.
Meie toruvisualiseerimine
Kujundame meie toru komponente joonisel 1. Ăksikasjalikult soovime koguda reaalajas kasutajateavet, töödelda see ja edastada BigQuery'sse. Logid genereeritakse, kui kasutajad suhelda tootega, saates pĂ€ringud serverisse, mis seejĂ€rel logitakse. Need andmed vĂ”ivad olla eriti kasulikud, et mĂ”ista, kuidas kasutajad meie tootega suhtlevad ja kas see töötab Ă”igesti. Ăldiselt sisaldab meil toru jĂ€rgmisi etappe:
Beam muudab selle protsessi vĂ€ga lihtsaks, sĂ”ltumata sellest, kas meil on voogedastusandmete allikas vĂ”i CSV-fail, ja tahame teostada partiitöötlust. Hiljem nĂ€ete, et koodis on vaid minimaalne muudatus, mis on vajalik nende vahel ĂŒlemiseks. See on ĂŒks Beam'i kasutamise eeliseid.

Joonis 1: Peamine andmestiku toru: Allikas:
Pseudandmete loomine Fakeriga
Nagu ma varem mainisin, otsustasin piiratud andmeedastuse tĂ”ttu luua pseudandmeid samas vormingus nagu tegelikud. See oli tĂ”eliselt kasulik harjutus, kuna sain kirjutada koodi ja testida toru samal ajal, kui ootasin andmeid. Vaatame lĂ€hemalt Fakerit, kui soovite nĂ€ha, mida see teek veel pakub. Meie kasutajate andmed sarnanevad ĂŒldiselt alloleva nĂ€itega. Selle vormingu pĂ”hjal saame ridade kaupa genereerida andmeid, et simuleerida reaalajas andmeid. Need logid annavad meile sellist teavet nagu kuupĂ€ev, pĂ€ringu tĂŒĂŒp, serveri vastus, IP-aadress jne.
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, nagu Gecko) Chrome/34.0.855.0 Safari/5312"
ĂkskĂ”ik, mis pĂ”hjal me loome meie muutuja LINE, kasutades allpool 7 muutujaid, millel on klesides. Kasutame neid samuti muutuja nimedena meie tabeli skeemis hiljem.
LINE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""
Kui me teeksime partiitöötlust, oleks kood vÀga sarnane, kuigi me peaksime looma proovide komplekti teatud ajavahemikus. Faker'i kasutamiseks loome lihtsalt objekti ja kutsume vajalikud meetodid. Eriti kasulik oli Faker IP-aadresside ja veebisaitide genereerimisel. Kasutasin jÀrgmisi meetodeid:
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_lineEsimese osa lÔpp.
JÀrgmiste pÀevade jooksul jagame teiega artikli jÀtku, kuid praegu ootame traditsiooniliselt teie kommentaare ;).
Allikas: habr.com
