Cum reduce Roblox costurile interogărilor Spark Join cu filtrele Bloom optimizate pentru învățare automată - Blog Roblox

Cum reduce Roblox costurile interogărilor Spark Join cu filtrele Bloom optimizate pentru învățare automată – Blog Roblox

Nodul sursă: 2983061

Abstract

În fiecare zi pe Roblox, 65.5 milioane de utilizatori interacționează cu milioane de experiențe, însumând 14.0 miliarde de ore trimestrial. Această interacțiune generează un lac de date la scară petabyte, care este îmbogățit în scopuri de analiză și învățare automată (ML). Este intensivă în resurse să unești tabelele de fapte și dimensiuni în lacul nostru de date, așa că pentru a optimiza acest lucru și a reduce amestecarea datelor, am adoptat Learned Bloom Filters [1] - structuri de date inteligente care folosesc ML. Prevăzând prezența, aceste filtre reduc considerabil datele de îmbinare, sporind eficiența și reducând costurile. Pe parcurs, ne-am îmbunătățit și arhitecturile modelului și am demonstrat beneficiile substanțiale pe care le oferă pentru reducerea orelor de memorie și CPU pentru procesare, precum și creșterea stabilității operaționale.

Introducere

În lacul nostru de date, tabelele de fapte și cuburile de date sunt partiționate în timp pentru un acces eficient, în timp ce tabelele de dimensiuni nu au astfel de partiții, iar alăturarea lor cu tabelele de fapte în timpul actualizărilor necesită multă resurse. Spațiul cheie al îmbinării este condus de partiția temporală a tabelului de fapte care este alăturat. Entitățile de dimensiune prezente în acea partiție temporală sunt un mic subset dintre cele prezente în întregul set de date de dimensiune. Ca rezultat, majoritatea datelor de dimensiune amestecate din aceste îmbinări sunt în cele din urmă eliminate. Pentru a optimiza acest proces și a reduce amestecurile inutile, am luat în considerare utilizarea Filtre de înflorire pe taste de unire distincte, dar s-au confruntat cu probleme legate de dimensiunea filtrului și amprenta memoriei.

Pentru a le aborda, am explorat Filtre de înflorire învățate, o soluție bazată pe ML care reduce dimensiunea filtrului Bloom, menținând în același timp rate scăzute de fals pozitive. Această inovație sporește eficiența operațiunilor de unire prin reducerea costurilor de calcul și îmbunătățirea stabilității sistemului. Următoarea schemă ilustrează procesele de îmbinare convenționale și optimizate în mediul nostru de calcul distribuit.

Îmbunătățirea eficienței asocierii cu filtrele de înflorire învățate

Pentru a optimiza îmbinarea dintre tabelele de fapte și dimensiuni, am adoptat implementarea Learned Bloom Filter. Am construit un index din cheile prezente în tabelul de fapte și, ulterior, am implementat indexul pentru a prefiltra datele de dimensiune înainte de operația de alăturare. 

Evoluție de la filtrele tradiționale de înflorire la filtrele de înflorire învățate

În timp ce un filtru Bloom tradițional este eficient, adaugă 15-25% din memorie suplimentară pentru fiecare nod de lucru care trebuie să îl încarce pentru a atinge rata de fals pozitive dorită. Dar prin valorificarea filtrelor de înflorire învățate, am obținut o dimensiune a indicelui redusă considerabil, menținând în același timp aceeași rată de fals pozitive. Acest lucru se datorează transformării filtrului Bloom într-o problemă de clasificare binară. Etichetele pozitive indică prezența valorilor în index, în timp ce etichetele negative înseamnă că acestea sunt absente.

Introducerea unui model ML facilitează verificarea inițială a valorilor, urmată de un filtru Bloom de rezervă pentru eliminarea negativelor false. Dimensiunea redusă provine din reprezentarea comprimată a modelului și din numărul redus de chei solicitate de filtrul Bloom de rezervă. Acest lucru îl diferențiază de abordarea convențională a filtrului de înflorire. 

Ca parte a acestei lucrări, am stabilit două metrici pentru evaluarea abordării noastre Learned Bloom Filter: dimensiunea finală a obiectului serializat al indexului și consumul CPU în timpul execuției interogărilor de îmbinare. 

Navigarea provocărilor de implementare

Provocarea noastră inițială a fost să abordăm un set de date de antrenament extrem de părtinitor, cu câteva chei de tabel de dimensiuni în tabelul de fapte. Făcând acest lucru, am observat o suprapunere de aproximativ una din trei chei între tabele. Pentru a rezolva acest lucru, am folosit abordarea Sandwich Learned Bloom Filter [2]. Aceasta integrează un filtru Bloom tradițional inițial pentru a reechilibra distribuția setului de date prin eliminarea majorității cheilor care lipseau din tabelul de fapte, eliminând efectiv mostrele negative din setul de date. Ulterior, numai cheile incluse în filtrul Bloom inițial, împreună cu falsele pozitive, au fost transmise modelului ML, adesea denumit „oracolul învățat”. Această abordare a dus la un set de date de antrenament bine echilibrat pentru oracolul învățat, depășind eficient problema părtinirii.

A doua provocare a fost centrată pe arhitectura modelului și caracteristicile de antrenament. Spre deosebire de problema clasică a adreselor URL de phishing [1], cheile noastre de conectare (care în cele mai multe cazuri sunt identificatori unici pentru utilizatori/experiențe) nu erau în mod inerent informative. Acest lucru ne-a determinat să explorăm atributele dimensiunii ca potențiale caracteristici ale modelului care ne pot ajuta să anticipăm dacă o entitate dimensiune este prezentă în tabelul de fapte. De exemplu, imaginați-vă un tabel de fapte care conține informații despre sesiunea utilizatorului pentru experiențe într-o anumită limbă. Locația geografică sau atributul de preferință de limbă al dimensiunii utilizator ar fi indicatori buni pentru a stabili dacă un utilizator individual este prezent sau nu în tabelul de fapte.

A treia provocare – latența de inferență – a necesitat modele care să minimizeze fals negative și să ofere răspunsuri rapide. Un model de arbore cu gradient a fost alegerea optimă pentru aceste valori cheie și i-am tăiat setul de caracteristici pentru a echilibra precizia și viteza.

Interogarea noastră actualizată de înscriere folosind filtrele Bloom învățate este prezentată mai jos:

REZULTATE

Iată rezultatele experimentelor noastre cu filtre Learned Bloom în lacul nostru de date. Le-am integrat în cinci sarcini de producție, fiecare dintre ele având caracteristici de date diferite. Cea mai costisitoare parte a acestor sarcini de lucru este îmbinarea dintre un tabel de fapte și un tabel de dimensiuni. Spațiul cheie al tabelelor de fapte este de aproximativ 30% din tabelul de dimensiuni. Pentru început, discutăm despre modul în care Learned Bloom Filter a depășit filtrele tradiționale de Bloom în ceea ce privește dimensiunea finală a obiectului serializat. În continuare, arătăm îmbunătățiri ale performanței pe care le-am observat prin integrarea filtrelor de înflorire învățate în conductele noastre de procesare a volumului de lucru.

Compararea dimensiunilor filtrului Bloom învățat

După cum se arată mai jos, atunci când se analizează o anumită rată fals pozitivă, cele două variante ale filtrului Bloom învățat îmbunătățesc dimensiunea totală a obiectului cu între 17-42% în comparație cu filtrele Bloom tradiționale.

În plus, prin utilizarea unui subset mai mic de caracteristici în modelul nostru bazat pe arbore cu gradient, am pierdut doar un mic procent de optimizare, făcând inferențe mai rapid.

Rezultate învățate de utilizare a filtrului Bloom 

În această secțiune, comparăm performanța îmbinărilor bazate pe Bloom Filter cu cea a îmbinărilor obișnuite pe mai multe valori. 

Tabelul de mai jos compară performanța sarcinilor de lucru cu și fără utilizarea filtrelor Learned Bloom. Un filtru de înflorire învățat cu 1% probabilitate totală fals pozitivă demonstrează comparația de mai jos, menținând în același timp aceeași configurație de cluster pentru ambele tipuri de unire. 

În primul rând, am descoperit că implementarea Bloom Filter a depășit unirea obișnuită cu până la 60% în orele CPU. Am observat o creștere a utilizării CPU a pasului de scanare pentru abordarea Learned Bloom Filter din cauza calculului suplimentar cheltuit în evaluarea Bloom Filter. Cu toate acestea, prefiltrarea efectuată în acest pas a redus dimensiunea datelor amestecate, ceea ce a ajutat la reducerea CPU utilizată de pașii din aval, reducând astfel numărul total de ore CPU.

În al doilea rând, filtrele Learned Bloom au cu aproximativ 80% mai puțină dimensiune totală a datelor și cu aproximativ 80% mai puțini octeți de amestecare totală scriși decât o îmbinare obișnuită. Acest lucru duce la o performanță mai stabilă de alăturare, așa cum se discută mai jos. 

De asemenea, am observat o utilizare redusă a resurselor în celelalte sarcini de producție aflate în experiment. Pe o perioadă de două săptămâni în toate cele cinci sarcini de lucru, abordarea Learned Bloom Filter a generat o medie economii zilnice de costuri of 25%, care ține cont și de formarea modelului și crearea de index.

Datorită cantității reduse de date amestecate în timpul efectuării unirii, am reușit să reducem semnificativ costurile operaționale ale conductei noastre de analiză, făcând, în același timp, mai stabilă. Următoarea diagramă arată variabilitatea (folosind un coeficient de variație) în duratele rulării (perete). ceas) pentru o sarcină de lucru obișnuită de asociere și o sarcină de lucru bazată pe Filtru de înflorire învățat pe o perioadă de două săptămâni pentru cele cinci sarcini de lucru pe care le-am experimentat. Execuțiile care utilizează filtrele Learned Bloom au fost mai stabile – mai consistente ca durată – ceea ce deschide posibilitatea de a le muta la resurse de calcul tranzitorii nefiabile mai ieftine. 

Referinte

[1] T. Kraska, A. Beutel, EH Chi, J. Dean și N. Polyzotis. Cazul pentru structurile index învățate. https://arxiv.org/abs/1712.01208, 2017.

[2] M. Mitzenmacher. Optimizarea filtrelor de înflorire învățate prin Sandwiching. 

https://arxiv.org/abs/1803.01474, 2018.


¹Începând cu 3 luni încheiate la 30 iunie 2023

²Începând cu 3 luni încheiate la 30 iunie 2023

Timestamp-ul:

Mai mult de la Roblox