Përshëndetje të gjithëve. Miq, po ndajmë me ju përkthimin e artikullit, përgatitur posaçërisht për studentët e kursit . Le të fillojmë!

Apache Beam dhe DataFlow për konvej të kohës reale
Posti i sotëm bazohet në një detyrë që kam trajtuar së fundmi në punë. Kam qenë vërtet i lumtur ta realizoj dhe ta përshkruaj punën time në formatin e një blogu, pasi kjo më dha mundësinë të merrem me inxhinierinë e të dhënave dhe të bëj diçka që do të ishte shumë e dobishme për ekipin tim. Nuk ka shumë kohë që zbulova se sistemet tona ruanin një sasi të madhe logu të përdoruesve, të lidhur me një nga produktet tona për punën me të dhëna. Doli se askush nuk po i përdorte këto të dhëna, kështu që menjëherë u interesova për atë që mund të mësonim nëse do të fillonim t'i analizojmë ato rregullisht. Megjithatë, kishte disa probleme në rrugën tonë. Problemi i parë ishte se të dhënat ishin ruajtur në shumë skedarë të ndryshëm tekstualë, të cilat nuk ishin të disponueshme për një analizë të menjëhershme. Problemi i dytë ishte se ato ishin të ruajtura në një sistem të mbyllur, kështu që nuk mund të përdorja asnjërin nga veglat e mia të preferuara për analizimin e të dhënave.
Unë duhej të vendosja se si ta bëja hyrjen më të lehtë për ne dhe të sillja ndonjë vlerë duke integruar këtë burim të dhënash në disa nga zgjidhjet tona për ndërveprimin me përdoruesit. Pasi mendoja për një kohë, vendosa të ndërtoja një pipeline për të transféruer këto të dhëna në një bazë të dhënash në cloud, në mënyrë që unë dhe ekipi të mund të kishim qasje në to dhe të fillonim të gjeneronim ndonjë përfundim. Pasi mbarova specializimin për Inxhinierinë e Të Dhënave në Coursera disa kohë më parë, isha i etur të përdorja disa nga mjetet e kursit në projekt.
Kështu, vendosja e të dhënave në një bazë të dhënash në cloud dukej si një mënyrë e arsyeshme për të zgjidhur problemin tim të parë, por çfarë mund të bëja me problemin e numrit 2? Fatmirësisht, kishte një mënyrë për të transferuar këto të dhëna në një mjedis ku mund të kisha qasje në mjete si Python dhe Google Cloud Platform (GCP). Megjithatë, ky ishte një proces i gjatë, prandaj duhej të bëja diçka që do të më lejonte të vazhdoja zhvillimin derisa të përfundonte transferimi i të dhënave. Zgjidhja në të cilën arrita ishte krijimi i të dhënave fals me ndihmën e bibliotekës Faker në Python. Kurrë nuk e kisha përdorur këtë bibliotekë më parë, por shpejt e kuptova se sa e dobishme ishte. Përdorimi i këtij qasje më lejoi të filloja të shkruaja kodin dhe të testoja pipeline-n pa të dhëna reale.
Duke marrë parasysh këtë, në këtë postim do të flas për mënyrën se si e ndërtova pipeline-n e përshkruar më sipër, duke përdorur disa nga teknologjitë që janë të disponueshme në GCP. Në veçanti, do të përdor Apache Beam (versionin për Python), Dataflow, Pub/Sub dhe Big Query për grumbullimin e log-ave të përdoruesve, transformimin e të dhënave dhe kalimin e tyre në një bazë të dhënash për analizë të mëtejshme. Në rastin tim, më duhej vetëm funksionaliteti i paketave të Beam, pasi të dhënat e mia nuk vinin në kohë reale, andaj Pub/Sub nuk ishte e nevojshme. Megjithatë, do të ndalem në versionin streaming, pasi kjo është ajo që mund të hasni në praktikë.
Hyrje në GCP dhe Apache Beam
Google Cloud Platform ofron një përmbledhje të veglave në të vërtetë të dobishme për përpunimin e të dhënave të mëdha. Ja disa nga veglat që do të përdor:
- â Ă«shtĂ« njĂ« shĂ«rbim mesashtesh qĂ« pĂ«rdor modelin Publisher-Subscriber, i cili na lejon tĂ« marrim tĂ« dhĂ«na nĂ« kohĂ« reale.
- â Ă«shtĂ« njĂ« shĂ«rbim qĂ« thjeshton krijimin e tubacioneve tĂ« tĂ« dhĂ«nave dhe zgjidh automatikisht detyra si shkallĂ«zimi i infrastrukturĂ«s, çka do tĂ« thotĂ« se mund tĂ« fokusohemi vetĂ«m nĂ« shkruan kodin pĂ«r tubacionin tonĂ«.
- â Ă«shtĂ« njĂ« depozita e dhĂ«nash nĂ« re. NĂ«se jeni tĂ« njohur me bazat e tjera tĂ« dhĂ«nash nĂ« SQL, nuk do t'ju duhet shumĂ« kohĂ« pĂ«r tĂ« kuptuar BigQuery.
- Dhe përfundimisht, do të përdorim Apache Beam, duke u përqëndruar veçanërisht në versionin Python për të krijuar tubacionin tonë. Ky mjet na lejon të krijojmë një tubacion për përpunimin në rrjedhë ose në grumbull, që integrohet me GCP. Ai është veçanërisht i dobishëm për përpunimin paralel dhe është i përshtatshëm për detyra të tilla si nxjerrja, transformimi dhe ngarkimi (ETL), kështu që, nëse na nevojitet të transferojmë të dhëna nga një vend në tjetrin me ekzekutimin e transformimeve ose llogaritjeve, Beam është një zgjedhje e mirë.
Ekziston një gamë e gjerë mjetesh të disponueshme në GCP, prandaj mund të jetë e vështirë t'i mbash mend të gjitha dhe qëllimin e tyre, por ja një përmbledhje e tyre për referencë.
Në GCP ka një sërë të madhe mjetesh, prandaj mund të jetë e vështirë t'i përfshish të gjitha, përfshirë qëllimin e tyre, por megjithatë përmbledhje për referencë.
Vizualizimi i tubacionit tonë
Le të vizualizojmë komponentët e tubacionit tonë në figurën 1. Në një nivel të lartë, ne dëshirojmë të mbledhim të dhëna të përdoruesve në kohë reale, t'i përpunojmë dhe t'i dërgojmë në BigQuery. Loget krijohen kur përdoruesit ndërveprojnë me produktin, duke dërguar kërkesa në server, të cilat më pas regjistrohen. Këto të dhëna mund të jenë veçanërisht të dobishme për të kuptuar se si përdoruesit ndërveprojnë me produktin tonë dhe nëse funksionon siç duhet. Në përgjithësi, tubacioni do të përmbajë këto hapa:
Beam e bën këtë proces shumë të lehtë, pavarësisht nëse kemi një burim të dhënash në kohë reale ose një skedar CSV dhe duam të kryejmë përpunim partal. Më vonë do të shihni se në kod është bërë vetëm një minimal ndryshim i nevojshëm për të kaluar mes tyre. Kjo është një nga përfitimet e përdorimit të Beam.

Figura 1: Tubacioni kryesor i të dhënave: Burimi:
Krijimi i të dhënave të rreme me Faker
Siç e përmenda më parë, për shkak të qasjes së kufizuar në të dhëna, vendosa të krijoj të dhëna të rreme në të njëjtin format si të dhënat reale. Kjo ishte një ushtrim vërtet i dobishëm, pasi mund të shkruaj kodin dhe të testoj kanalin, ndërsa prisja të dhënat. Le të shohim Faker, nëse dëshironi të dini se çfarë tjetër ofron kjo bibliotekë. Të dhënat tona të personalizuara do të jenë zakonisht të ngjashme me shembullin më poshtë. Bazosuar në këtë format, ne mund të gjenerojmë të dhëna rresht pas rreshti për të imituar të dhënat në kohë reale. Këto loge na japin informacione si data, lloji i kërkesës, përgjigja nga serveri, adresa IP, etj.
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, si Gecko) Chrome/34.0.855.0 Safari/5312"
Bazosuar në rreshtin më lart, ne duam të krijojmë ndryshoren tonë LINE, duke përdorur 7 variabla në këto kllapa të mbyllura më poshtë. Ne gjithashtu do t'i përdorim ato si emra variablash në skemën tonë të tabelave pak më vonë.
LINE = """
{remote_addr} - - [{time_local}] "{request_type} {request_path} HTTP/1.1" [{status}] {body_bytes_sent} "{http_referer}" "{http_user_agent}"
"""
Nëse do të bënim përpunim grupor, kodi do të ishte shumë i ngjashëm, edhe pse do të na duhej të krijonim një grup mostrash brenda një periudhe të caktuar kohore. Për të përdorur fakes, thjesht krijojmë një objekt dhe thërrasim metodat që na duhen. Në veçanti, Faker ka qenë i dobishëm për krijimin e adresave IP, si dhe të faqeve të internetit. Unë përdora metodat e mëposhtme:
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_lineFundi i pjesës së parë.
Në ditët në vijim do të ndajmë me ju vazhdimin e artikullit, ndërsa tani tradicionalisht presim komentet ;-).
Burimi: habr.com
