Documente Academic
Documente Profesional
Documente Cultură
Slabu Florin
2023
1
Cuprins
Cuprins........................................................................................................................................2
Capitolul 1. Introducere..............................................................................................................3
1.1 Big Data............................................................................................................................3
1.2 Cloud computing...............................................................................................................5
1.3 Hadoop - Un framework pentru calcule distribuite..........................................................7
1.4 MapReduce.....................................................................................................................10
Bibliografie...............................................................................................................................24
2
Capitolul 1. Introducere
Exploatarea seturilor mari de date sau analiza seturilor mari de date sunt două subiecte
frecvent întâlnite în ultima decadă. De exemplu, există multe conferințe, prezentări, demo-uri
etc. toate având drept subiect central metode și algoritmi matematici pentru rezolvarea noilor
probleme apărute din analiza cantităţilor mari de date.
Aceste subiecte acoperă procesul de analiză a unor cantități foarte mari de date cu accent
pe metodele de extragere a datelor și de învățare automată. Mulţimile mari de date nu au
apărut din senin în ultimii ani, companiile colectând de ceva vreme datele strategice într-un
fel sau altul: de exemplu companiile farmaceutice au colectat cantități uriașe de informații în
timpul cercetărilor lor, date care sunt disponibile în rețelele private ale acestora prin
intermediul unor depozite locale de date. Camerele de supraveghere, RFID, tot felul de
senzori folosiți în cadrul sistemelor de securitate, toate au produs date care ar putea și sunt
stocate.
Termenul de Big data descrie seturi de date care cresc foarte repede şi devin atât de mari
încât devine ineficientă procesarea acestora cu instrumente tradiționale precum sisteme de
gestiune a bazelor de date, sisteme de gestiune a conținutului sau vreun software avansat de
analiză statistică.
Astăzi, în fiecare domeniu, se găsesc cantități foarte mari de date, cum ar fi datele
rezultate din diverse procese precum tranzacțiile de comerț electronic, tranzacțiile bancare sau
tranzacțiile cu cardurile de credit, navigarea pe web concretizată în jurnalele site-urilor web.
Trebuie să menționăm cantitatea uriașă de date (personale) păstrate de către rețelele sociale
precum Facebook1 sau Linkedin2.
Problema cu aceste date de dimensiuni mari nu este atât complexitatea proceselor
implicate, cât mai degrabă cantitatea de date și rata de colectare a datelor noi.
În prezent, majoritatea companiilor din domeniu trebuie să gestioneze o cantitate
semnificativă de date, pe care trebuie să le prelucreze în timpul activităților lor zilnice.
Primele afaceri, care au fost afectate de creșterea exponențială a datelor au fost motoarele de
1
http://www.facebook.com/
2
https://www.linkedin.com/
3
căutare precum Yahoo și Google şi rețelele sociale precum Facebook sau Twitter. De
exemplu, multe date sunt generate regulat pe Facebook: foarte mulţi dintre utilizatorii activi
încarcă o mulțime de imagini și videoclipuri sau partajează conținuturi precum link-uri web,
postări de blog, fotografii, note etc. În 2009 cantitatea de videoclipuri și fotografii încărcate pe
Facebook era de peste 1 miliard în fiecare lună.
Câteva informaţii statistice despre datele generate de Facebook:
peste 1,96 miliarde de utilizatori activi zilnic în medie(iunie 2022)3;
300 de milioane de utilizatori folosesc Facebook Stories zilnic față de 500 de milioane
care folosesc Instagram Stories în fiecare zi (ianuarie 2019);
numărul total de conexiuni ale prietenilor pe Facebook a fost de peste 150 de miliarde
(februarie 2013)4;
numărul total de fotografii încărcate a depășit în septembrie 2013 valoarea de 250 de
miliarde5;
media fotografiilor încărcate zilnic a fost de peste 350 de milioane (februarie 2013);
există mai mult de 300 PB de date despre utilizator (noiembrie 2013).
Prelucrarea cantităţilor mari de date nu poate fi efectuată de oameni sau prin instrumentele
existente concepute pentru a prelucra seturi mici de date, deoarece nu mai sunt eficiente în
cazul în care cantitatea de date depășește o anumită limită. Sistemele de gestiune a bazelor de
date clasice sunt utile în special pentru date de tip structurat, în timp ce big data nu înseamnă
doar date structurate, cât și semi-structurate sau date nestructurate. Cantitatea de date
nestructurate este într-o creștere mai rapidă decât cantitatea de date structurate, aproximativ
80% din date publice dovedindu-se a fi date nestructurate.
colecta peste 150 de miliarde de înregistrări noi pe zi, rezultând o rată de creştere ce
depăşea 50 TB / zi6.
În 2008, Google prelucra aproximativ 20 PB de date pe zi.
Necesitatea dezvoltării unor algoritmi specializaţi, ce pot prelucra o cantitate
semnificativă de date, devine mai presantă având în vedere epoca activităţilor intens digitale
în care trăim [7]. Efortul pentru implementarea unor astfel de algoritmi a primit o mână de
ajutor odată cu apariţia tehnologiilor de de cloud computing.
Capacitatea de a stoca, agrega, combina datele și apoi de a folosi rezultatele acestor
prelucrări pentru a efectua o analiză profundă a datelor a devenit acum mai accesibilă, datorită
unor tendințe precum Legea lui Moore pentru procesoare, sau echivalentul acesteia în stocarea
3
https://www.oberlo.com/blog/facebook-statistics
4
https://expandedramblings.com/index.php/by-the-numbers-17-amazing-facebook-stats/
5
https://www.omnicoreagency.com/facebook-statistics/
6
http://www.dbms2.com/2009/04/30/ebays-two-enormous-data-warehouses/
4
digitală și cloud computing, ce continuă să scadă costurile și să depăşească alte bariere
tehnologice [8].
Deși conceptul de „cloud computing” este vechi, definiția acestui termen datează din
1997, când a fost enuntata pentru prima oară de profesorul Ramnath Chellappa în articolul său
intitulat „Intermediaries in Cloud-Computing: A New Computing Paradigm” [9].
7
NIST http://www.nist.gov/index.html
8
a 'cloud' is an elastic execution environment of resources involving multiple stakeholders and providing a
metered service at multiple granularities for a specified level of quality (of service).
9
http://en.wikipedia.org/wiki/Cloud_computing
5
Figura 1 Arhitectura cloud computing
Din punctul de vedere al unui client, cel mai bun comportament al unui serviciu este un
serviciu de cloud computing ce oferă acces la resurse (hardware și software), sub impresia că
sunt nelimitate. Aceasta necesită alocarea și managementul automat al resurselor pentru a
prelucra eficient toate cererile. O soluție care se scalează bine pentru această problemă, este
virtualizarea. De asemenea, virtualizarea are avantaje certe din punct de vedere al securităţii.
La rularea mai multor mașini virtuale într-un mediu de tip cloud, procesoarele, memoria
principală, plăcile de rețea și hard disk-urile trebuie să fie partajate de maşinile virtuale
lansate pe același server fizic. Deși procesoarele și memoria principală pot fi partajate,
blocajele apar la nivelul operaţiilor de I/O de rețea și disc. Îmbunătățirea virtualizărilor
întreruperilor și a canalelor de I/O se poate face cu ajutorul inginerilor proiectanţi de hardware
şi a programatorilor ce lucrează la dezvoltarea sistemelor de operare.
Principalele modele de implementare pentru sistemele de cloud sunt:
Public cloud - în acest model de implementare, resursele cloud sunt puse la dispoziția
publicului larg;
Community cloud - cloud-ul este operat de o comunitate care permite organizațiilor
membre să partajeze infrastructura. Organizațiile membre au în comun aceleași
interese, obiective, obiective.
Cloud hibrid - este un model intermediar de la public cloud la private cloud;
Private cloud - serviciul este disponibil numai pentru o singură entitate, fiind dezvoltat
și întreținut de același actor.
Infrastructura cloud se bazează pe trei modele de servicii:
6
Infrastructura ca serviciu (IaaS) - furnizorii de cloud oferă infrastructura pentru
utilizatorii de cloud, de obicei ca mașină virtuală [3] (de exemplu Amazon S310, SQL
Azure11, Amazon EC212);
Platforma ca serviciu (PaaS) - furnizorii de cloud oferă utilizatorilor de cloud o
întreagă platformă de dezvoltare şi mai mult, compusă din sistem de operare, mediu de
programare, bază de date, server web (de exemplu Google App Engine13, Windows
Azure14);
Software as a Service (SaaS) - furnizorii de cloud oferă implementări pentru diferite
aplicații software destinate utilizatorilor de cloud (de exemplu Google Docs15,
Microsoft Office 36516).
Unii cercetători susțin [1] că deşi preţul serviciului pay-as-you-go este mai mare decât
costul de amortizare al unui server într-o anumită perioadă de timp, beneficiile sunt oferite
prin transferul riscului (supra-aprovizionare sau subprovizionare) și proprietatea elasticității
serviciului.
Caracteristicile care fac cloud computing atât de atractiv sunt utilizarea pe termen scurt,
fără costuri ridicate și capacitatea infinită la cerere [1].
10
http://aws.amazon.com/s3/
11
https://azure.microsoft.com/en-us/services/sql-database/
12
https://aws.amazon.com/ec2/
13
https://cloud.google.com/appengine/docs
14
https://azure.microsoft.com/en-us/
15
https://docs.google.com/
16
http://www.microsoft.com/office365/
7
3. scalabil – gestionează cu ușurință procesarea unor cantități mari de date prin
adăugarea la cluster, în mod transparent, a unor noduri noi;
4. simplu - permite dezvoltatorilor să scrie într-un timp scurt cod specific.
Hadoop prezintă un domeniu destul de mare de aplicații specifice. Câteva exemple includ
aplicațiile de comerț electronic online pentru furnizarea de recomandări mai bune clienților
interesaţi de anumite produse sau aplicații financiare pentru analiza și evaluarea riscurilor ce
folosesc modele de calcul sofisticate ale căror rezultate nu pot fi stocate într-o bază de date.
Hadoop a câștigat o popularitate foarte mare, companii precum Yahoo! [6], New York
Times, IBM, Facebook, Hulu etc. folosindu-l în activitatea zilnică. Un factor ce a contribuit la
adoptarea sa se referă la faptul că aplicațiile bazate pe Hadoop pot fi executate pe toate
sistemele de operare: Windows, Linux, Unix și Mac OS, chiar dacă Linux este platforma sa
oficială.
Framework-ul de bază Hadoop este compus din următoarele module:
Hadoop Common - conține biblioteci și utilitare necesare altor module Hadoop.
Sistemul de fișiere distribuit Hadoop (HDFS) - un sistem de fișiere distribuit ce
pastrează datele pe calculatoare obişnuite, oferind o lățime de bandă agregată foarte
mare pentru întregul cluster.
Hadoop YARN - o platformă de gestionare a resurselor, adăugată începând cu Hadoop
2.0, responsabilă pentru gestionarea resurselor de calcul din clustere și utilizarea
acestora pentru programarea aplicațiilor utilizatorilor.
Hadoop MapReduce - un model de programare pentru prelucrarea datelor pe scară
largă.
Hadoop implementează o arhitectură master-slave folosită atât pentru stocarea distribuită
a datelor, cât și pentru calcule distribuite.
9
Figura 3 Arhitectura unui cluster Hadoop
1.4 MapReduce
Modelul de programare MapReduce a fost descris pentru prima dată de către cercetătorii
Jeffrey Dean și Sanjay Ghemawat în lucrarea publicată în 2004, intitulată MapReduce:
Simplified Data Processing on Large Clusters [10]. Acest model de programare fusese
proiectat și introdus în producţie de ceva devreme de către cercetătorii de la Google, dar
implementarea sa nu a fost făcută publică. Schema de procesare a datelor a devenit curând
foarte populară, la adoptarea sa pe scară largă contribuind şi framework-ul open-source
Hadoop, apărut în 2005. Un job în cadrul modelului de programare MapReduce împarte
mulţimea datelor de intrare în mai multe blocuri independente de date şi care sunt procesate în
paralel.
Se cuvine să amintim două idei de bază ce pot fi întâlnite în MapReduce:
Există o strategie binecunoscută în informatică pentru rezolvarea problemelor, o
metodă generală pentru elaborarea algoritmilor, denumită divide-et-impera: când
trebuie să rezolvăm o problemă a cărei soluție generală este necunoscută, atunci
problema este descompusă în subprobleme mai mici, aplicăm aceeași strategie pentru
fiecare din acestea și combinăm rezultatele / soluțiile parțiale corespunzătoare fiecărei
subprobleme într-o soluție generală. Procesul de descompunere continuă până când
dimensiunea subproblemei este suficient de mică pentru a fi gestionată individual.
Metoda generală de calcul se bazează pe două structuri de date, perechea (cheie,
valoare) și lista. Proiectarea algoritmilor MapReduce implică utilizarea perechilor
(cheie, valoare) peste mulţimi de date oarecare.
10
Conceptele Map și Reduce au fost inspirate din programarea funcțională, Lisp având două
funcții cu semnificație similară, map și fold. Operațiile funcționale au proprietatea de a păstra
structurile de date astfel încât datele originale să rămână nemodificate și să fie create noi
structuri de date.
Funcția map are drept argumente o funcție f și o listă, aplică funcția f fiecărui element al
listei de intrare, rezultând o listă nouă de ieșire.
Funcția fold prezintă un argument suplimentar în comparație cu argumentele funcţiei map:
pe lângă funcția f și lista de intrare, avem un acumulator. Funcția f este aplicată fiecărui
element al listei de intrare, rezultatul este adăugat la acumulatorul anterior obținându-se
valoarea acumulatorului pentru pasul următor.
Detaliile de implementare ale unei abordări divide-et-impera nu sunt aşa de simple, deși
ideea pare a fi foarte simplă,. Există multe elemente particulare de care trebuie să se ocupe un
programator:
descompunerea problemei și alocarea subproblemelor către workeri;
sincronizarea între workeri;
comunicarea rezultatelor parțiale și combinarea acestora pentru a obţine soluții locale;
gestionarea defecțiunilor software / hardware;
gestionarea eșecurilor workerilor.
MapReduce a fost proiectat în jurul a două concepte importante, mapper și reducer, în
timp ce comunicarea între procese se realizează pe baza unor liste de perechi de tip cheie-
valoare. Mapper și reducer au fost concepute ca două funcții ce trebuie să fie implementate de
către utilizator cu următoarele semnături:
,
.
11
cluster, pentru a putea fi procesate (rulate) în paralel. Cheile și valorile pot fi de orice tip,
definite sau nu de către utilizator.
Există o singură regulă care se aplică pentru datele de ieșire ale mapperului și pentru
datele de intrare ale reducerului: tipul cheilor și al valorilor din datele de ieşire ale mapperului
trebuie să se potrivească cu tipul cheilor și al valorilor din datele de intrare ale reducerului,
figura 4.
Iată câteva exemple de algoritmi dezvoltați utilizând tehnica MapReduce: pi, distribuited
grep, index inversat, calculul frecvențelor numărului de adrese URL etc. [11], [12], [13], [14].
Pentru a reduce traficul de rețea încărcat de schimbul de date între nodurile mapper și
nodurile reducer implicate în aceeași lucrare MapReduce, se poate introduce un task
combiner. Un combiner poate fi văzut ca un task „mini-reducer”, care funcționează numai pe
datele generate de o mașină.
12
Capitolul 2. Algoritmi pentru calculul indexului Jaccard
2.1 Introducere
La ora actuala structurile de date de tip graf, începând cu rețelele sociale precum
Facebook, MySpace, NetFlix și terminând cu rute de transport sau arhitectura infrastructurii
Internet. Aceste grafuri continuă să crească în dimensiuni și există o mulțime de date noi pe
care oamenii ar dori să le deducă din numeroasele fațete ale informațiilor stocate în aceste
structuri de date.
Grafurile pot avea miliarde de vârfuri și muchii. Graful citarilor, graful afilierilor, graful
de convorbirilor de mesagerie instant, graful apelurilor telefonice fac parte din așa-numita
analiză a rețelelor sociale. În lucrarea [24] este arătat că, în ciuda presupunerii ca aceste
grafuri sunt grafuri rare, densitatea acestora crește în timp.
Dezvoltarea și implementarea unor algoritmi capabili de a prelucra cantități uriașe de date
a devenit mai accesibilă datorită cloud-computing [1] și modelului de programare MapReduce
[15], care a permis dezvoltarea unor framework-uri open-source, cum ar fi Apache Hadoop.
Un rol foarte important în evoluția cloud computing îl joacă Amazon, care oferă cea mai
utilizata bibliotecă online din întreaga lume. Această companie a introdus două servicii de
cloud computing, destinate inițial doar pentru utilizarea internă și care, în timp, au devenit
foarte populare în cadrul comunității IT datorită proiectării inteligente, ceea ce a condus la o
utilizare facilă pentru programatori: EC217 - pentru calcule și S3e18 - pentru depozitarea și
gestionarea resurselor.
Aplicațiile MapReduce sunt extrem de largi, fiind întâlnit de exemplu la framework-uri de
calcul distribuit cu aplicații în securitatea sistemelor informatice, cum ar fi detectarea botnet-
ilor şi clasificarea spamului [16] sau detectarea spamului [17]. Autorii ultimei lucrări au
utilizat setul de date WEBSPAM-UK2007 pentru verificarea experimentala a algoritmilor
propusi, set de date pe care l-am utilizat pentru validarea rezultatelor prezentate in acest
capitol.
17
Amazon Elastic Compute Cloud - http://aws.amazon.com/ec2/
18
Amazon Simple Storage Service - http://aws.amazon.com/s3/
13
În [18] autorii analizează corpusul relațiilor cu utilizatorii al site-ului de știri de tehnologie
Slashdot. Lucrarea explorează, printre alte elemente caracteristice, caracteristicile la nivel de
legătură, cum ar fi distanțe și măsuri de similaritate.
De-a lungul timpului au fost definite și studiate mai multe măsuri de similaritate. Datorită
diverselor studii comparative efectuate, cercetătorii au ajuns să cunoască avantajele și
dezavantajele acestora [13]. Una dintre aceste măsuri, indicele de similaritate Jaccard, are
diverse aplicații [19], [20], [21].
În [22] coeficientul Jaccard a fost ales dintre diferite măsuri de similaritate pentru
evaluarea algoritmului de localizare propus Rank Based Fingerprinting (RBF). Într-o altă
lucrare, Leydesdorff [23] prezintă rezultatele unei comparații empirice a mai multor măsuri de
similaritate directe și indirecte: corelațiile de rang Spearman între puterea de asociere
(denumită afinitatea probabilistică sau indicele de activitate), cosinusul și indicele Jaccard.
Măsurile sunt aplicate unui set de date de intrare mai mic decât cel luat în considerare în acest
capitol, format din frecvențele de co-citare a 24 de autori.
Implementarea prezentată în continuare pentru calculul indicelui de similaritate Jaccard
este inspirată din [19].
Din punct de vedere simplu, măsurile de similaritate denotă apropierea dintre două sau
mai multe obiecte. O clasă importantă de măsuri de similaritate este reprezentată de funcţiile
de distanță. Fie A o mulțime de elemente, numit spațiu. Fie o funcție ,
având ca argument o pereche de elemente din , fiind un număr real. A se
numeşte spaţiu metric dacă există o funcție , ce satisface următoarele
patru proprietăţi:
[1] (distanţa dintre două elemente este întotdeauna un număr pozitiv). d este
pozitiv definită.
[2] .
[3] (d este simetrică).
[4] (inegalitatea triunghiului).
O funcție d cu proprietățile de mai sus se numește funcție distanță sau metrică.
Noțiunea de similaritate este foarte flexibilă, existând mai multe funcţii de distanță:
distanța Euclidiană, distanța Jaccard, distanța cosinus, distanța de editare, distanța Tanimoto
etc. [13].
14
Una dintre cele mai populare metrici utilizate pentru a evalua gradul de similaritate dintre
două seturi de date este indicele Jaccard (sau coeficientul de similaritate Jaccard) definit ca
raportul dintre cardinalul intersecției a două mulţimi și cardinalul reuniunii acelorași două
mulţimi de date
(1)
Indicele de similaritate Jaccard nu este o funcţie distanță și poate fi aplicat la obiecte care
au atribute binare.
Funcția definită ca diferența dintre 1 și indicele Jaccard este o funcţie distanță (metrică)
cunoscută sub numele de distanţă Jaccard. Măsoară gradul de disimilaritate între două
muțimi de date, definite drept complementul coeficientului Jaccard:
(2)
Exemplu [27]:
Să considerăm două site-uri web notate cu A și B. Dorim să evaluăm gradul de
asemănare pentru aceste două site-uri web, influențat de faptul că partajează aceleași link-
uri (către alte site-uri) în paginile lor web. Vom lua în considerare numai numele site-ului
prezent în URL-ul unui link dintr-o pagină web.
Să presupunem că Host1, Host2, Host3, Host4 sunt toate nume de site-uri la care fac
referire linkurile URL din paginile web de pe cele două site-uri web. Tabelul următor
prezintă legăturile enumerate în paginile web de pe site-urile A și B.
Site Host1 Host2 Host3 Host4
A Da Da Da Da
B Nu Da Nu Nu
Tabelul 1 Distribuţia legăturiloe pentru site-urile A şi B
Fie două obiecte, A și B, descrise de n atribute binare. Indicele Jaccard măsoară, în acest
caz, gradul de similaritate între A și B din punctul de vedere al atributelor. Să considerăm
următoarele variabile:
- numărul total de atribute din A și B având aceleași valori 1;
15
- numărul total de atribute având valoarea 0 pentru obiectul A și având
valoarea 1 pentru obiectul B;
- numărul total de atribute având valoarea 1 pentru obiectul A și având
valoarea 0 pentru obiectul B;
- numărul total de atribute din A și B având aceleași valori 0.
Formula pentru indicele Jaccard (coeficientul de similaritate Jaccard) devine:
(3)
Prima parte este reprezentată de calculul indicelui Jaccard între oricare două noduri ale
grafului de intrare. Acest proces poate fi descompus în trei etape:
1. În prima etapă, datele de intrare sunt citite dintr-un fișier: fiecare linie reprezintă o
muchie a grafului descrisă de cele două vârfuri ale sale. Avem următoarele notaţii
speciale: primul nod reprezintă cheia k, în timp ce al doilea nod reprezintă valoarea v.
Functia map a primul job (a se vedea Algoritmul 1) trebuie doar să analizeze fiecare
linie a fișierului de intrare și să emită perechi .
Algoritmul 1 XYMapper
INPUT:
k - id nodului curent
v – informația nodului
1: class Mapper
2: method Map( , )
3: Emit(k, v) // emite actualizări pentru nodul curent
4: end method
5: end class
16
este păstrată de cheia k). Pentru fiecare pereche se emite o nouă pereche
, unde reprezintă un vârf din lista de vecini ai vârfului k și va fi
utilizat în continuare pentru intersecția listelor de vecini ale oricăror două vârfuri ale
grafului.
Algoritmul 2 CountCardinalReducer
INPUT:
k - id nodului curent
L – lista vecinilor nodului k
1: class Reducer
2: method Reduce( , )
3: for all do
4: Emit(k, {v, size(L)})
5: end for
6: end method
7: end class
2. În a doua etapă, funcţia map a celui de-al doilea job (a se vedea Algoritmul 3)
primește ca date de intrare valorile calculate de functia reduce a
primului job. Pozițiile vârfurilor în cadrul datelor de intrare sunt interschimbate:
functia map va genera o pereche nouă cheie-valoare de forma
unde v este nodul conținut în partea de valoare procesată de catre functia reduce
de la pasul anterior, în timp ce "valoarea" din această pereche nouă (valoarea
) este compusă din "cheia" k a perechii de intrare și valoarea
cardinalului mulţimii, count.
Algoritmul 3 FromXYToYXMapper
INPUT:
k - id nodului curent
v - un nod din multimea vecinilor nodului curent
count – cardinalul multimii vecinilor nodului
1: class Mapper
2: method Map( , )
3: Emit(v, {k, count})
4: end method
5: end class
17
caractere, fie având dimensiunea maximă, fie cu valorile rămase, funcţia reduce emite o
pereche constând din șirul vid drept cheie, şi șirul construit drept valoare.
Algoritmul 4 SplitReducer
INPUT:
k – id-ul nodului curent
L – informatia din lista nodurilor
1: class Reducer
2: method Reduce( , )
3:
4: for all do
5:
6: end for
7:
8:
9: Emit(newKey, newValue)
10: end method
11: end class
3. Ultima sarcină din această parte de procesare calculează indicele Jaccard pentru
fiecare pereche de vârfuri.
Metoda map primește un șir vid drept cheie și un șir de caractere str ca valoare (a se
vedea Algoritmul 5) [27]. Elementele din șirul str sunt extrase și păstrate într-o listă
L. Mai departe, se vor construi toate perechile , din fiecare element al listei L,
și fiecare alt element al listei L, , . Metoda emite perechi având drept
cheie o pereche de noduri ale grafului și ca valoare, suma cardinalelor
mulțimilor vecine .
Algoritmul 5 CollectAllPairsMapper
INPUT:
k – id-ul nodului curent
str – sir de caractere
1: class Mapper
2: method Map( , )
3:
4: while (str.hasMoreTokens()) do
5: x parse(str.nextToken())
18
6: c parse(str.nextToken())
7:
8: end while
9: while ( ) do
10:
11:
12: if ( ) then
13: Emit({x, y}, n + m)
14: else
15: Emit({y, x}, n + m)
16: end if
17: end while
18: end method
19: end class
Vom parsa şirul de caractere str, descompunându-l în cuvinte (token-uri). Funcţia
(metoda) hasMoreTokens() întoarce valoarea true dacă şirul str mai are cuvinte
neprocesate. Metoda nextToken() returnează următorul cuvânt din şirul de caractere
str. Metoda parse() transformă un şir de caractere în valoarea numerică asociată.
Ultimul reducer (Algoritmul 6) primește o cheie alcătuită dintr-o pereche de noduri ale
grafului , ale căror liste de vecinătate au intersecția nevidă și o listă de valori,
fiecare valoare reprezentând suma cardinalelor mulțimilor de vecini ai nodurilor :
. Se calculează cardinalul listei L - această valoare reprezintă cardinalul
mulțimii obținute din intersecția dintre mulţimea vecinilor vârfului u și mulţimea vecinilor
vârfului v (numărul de noduri care sunt vecini atât nodului u cât şi nodului v). Indicele
Jaccard al perechii este raportul dintre cardinalul listei L și diferența dintre suma
cardinalelor mulțimilor de vecini și cardinalul intersecției.
Algoritmul 6 ComputeJaccardReducer
INPUT:
{u, v} – o pereche cu două vârfuri
L - lista cu valorile reprezentând suma cardinalelor multimilor de vecini
1: class Reducer
2: method Reduce( , )
3:
4: Emit({u, v}, n/(m-n))
5: end method
6: end class
19
A doua parte este reprezentată de un algoritm ce calculează frecvența valorilor indicelui
Jaccard pentru un graf dat. Algoritmul constă dintr-o singură etapă de procesare MapReduce.
Funcţia map (a se vedea Algoritmul 7) își obține datele din fișierul de intrare, sub formă
de perechi (cheie, valoare), unde fiecare linie din fișierul de intrare este trimisă prin
elementul valoare al perechii și conține valorile corespunzătoare id-urilor a două vârfuri și
valoarea indicelui Jaccard corespunzător lor, u v r. Metoda emite o pereche
unde k reprezintă valoarea indicelui Jaccard asociată perechilor de vârfuri u v, iar
newValue este un șir format din cele două noduri, separate printr-o virgulă.
Algoritmul 7 NodesToJaccardMapper
INPUT:
k - cheia
txt - textul de intrare
1: class Mapper
2: method Map( , )
3: u parse(txt.nextToken())
4: v parse(txt.nextToken())
5: r parse(txt.nextToken())
6: Emit(r, u + ”,” + v)
7: end method
8: end class
Functia reducer (a se vedea Algoritmul 8) primește pentru o valoare a cheii k,lista tuturor
perechilor de noduri care au aceeași valoare pentru indicele Jaccard. Numără elementele din
lista de intrare și emite o pereche , unde k conține valoarea indicelui Jaccard și
Algoritmul 8 CountJaccardValuesReducer
INPUT:
k – valoarea indicelui Jaccard
L– lista de siruri de caractere
1: class Reducer
2: method Reduce ( , )
3:
4: Emit(k, count)
5: end method
6: end class.
20
2.4 Rezultate experimentale
Indicele
Node1 Node2
Jaccard
100012 100002 0.016528925
100021 100002 0.002851711
100024 100012 0.023121387
100024 100021 0.018365473
100059 100007 0.1
100059 100012 0.006264462
100061 100024 0.012987013
100062 100010 0.03125
100062 100018 0.045454547
100064 100021 0.001897533
100083 100077 0.33333334
100088 100010 0.03448276
100107 100104 0.25
Tabelul 2. Valorile indicelui Jaccard pentru un eșantion de perechi de noduri din graful Webspam-
Uk2007.
Aplicația a fost rulată pe un cluster virtual, format din șase mașini virtuale. Mașina
principală a găzduit daemoni pentru NameNode, Secondary NameNode și JobTracker, în timp
ce daemoni DataNode și TaskTracker au rulat pe celelalte cinci mașini din cluster (slaves).
21
Fiecare mașină virtuală avea 1 GB RAM, un procesor dual corel de 1.99 GHz și un
hard disk cu o capacitate de 25 GB. Mașinile virtuale au fost lansate și gestionate folosind
VMWareESX 5.019. Versiunea Hadoop instalată pe aceste mașini a fost Hadoop 0.18.0 [25],
[26].Mărimea fișierului de intrare pentru aplicație a fost de 16 MB, în timp ce dimensiunea
fișierului rezultat a fost de peste 2 GB. Câteva linii din fișierul de ieșire sunt listate în tabelul
2.
Histograma indicelui Jaccard este reprezentată în figura 4 [26], unde se poate vedea că
majoritatea nodurilor din graful considerat au coeficientul de similaritate Jaccard inclus în
intervalul [0.0, 0.1). Acest interval conține peste 70000000 de valori ale indicilor, astfel
majoritatea nodurilor din graful nostru sunt complet diferite (din punct de vedere al
asemănării). În ceea ce privește nodurile identice din punct de vedere al similitudinii, există
mai mult de 150000 de indici având valoarea 1, în timp ce peste 50 000 sunt aproape identici,
având valoarea coeficientul Jaccard aparţinând intervalului [0.9, 1.0). Pentru a examina
în continuare intervalul [0.0, 0.1), a fost împărțit în intervale mai mici, rezultatele fiind
afișate în figura 5 [27].
19
http://www.vmware.com/products/esxi-and-esx/
22
Figura 5. Distribuția valorilor indicelui Jaccard pe intervalul [0.0, 0.3) pentru setul de date
WEBSPAM – UK2007
Din această figură, se poate observa că cele mai multe site-uri din setul de date ales au una
sau două legături comune pentru fiecare 100 de site-uri adiacente. Distribuția indicelui
Jaccard este foarte eterogenă din cauza setului de date ales. Valori mai mici sunt obținute în
functie de numărul de site-uri care au valori ale coeficientului de similaritate Jaccard de la
0.13-0.14 (pentru site-urile care au 13-14 legături comune la fiecare 100 de vecini).
2.5 Concluzii
În ceea ce privește mulţimea de date WEBSPAM-UK2007, să luăm în considerare două
site-uri diferite și . Să notăm cu A mulțimea de site-uri vecine cu (site-uri care au
cel puțin o pagină web indicată de către un link conţinut de o pagină web din ) și B
mulțimea de site-uri vecine cu . Indicele Jaccard pentru și reprezintă reprezintă
măsura suprapunerii mulțimilor A și B. Cu alte cuvinte, această valoare reprezintă numărul de
site-uri vecine simultan cu cele două site-uri și raportat la numărul total de site-uri
care sunt vecine cu cel puţin unul dintre cele două site-uri considerate.
Dacă două site-uri și au indicele Jaccard ≈ 1, atunci:
1) putem concluziona că gradul lor de hub este similar luând în considerare doar numărul
de site-uri la care se referă (considerăm noțiunea de hub așa cum a fost introdusă pentru
algoritmul HITS [29]);
2) ar putea fi o măsură bună pentru clasificarea site-urilor ca fiind spam / non-spam (dacă
un site a fost deja clasificat ca fiind spam, atunci toate site-urile care au indicele Jaccard ≈ 1,
sunt candidați buni pentru aceeași etichetare);
23
3) cele două site-uri sunt conectate din punct de vedere semantic (dacă au în comun o
mulțime de site-uri învecinate, atunci informațiile pe care le găzduiesc sunt similare).
Pe de altă parte, un indice Jaccard ≈ 0 înseamnă că cele două site-uri au mai puține
trăsături caracteristice comune din punct de vedere semantic.
Scopul principal a fost dezvoltarea unei aplicații distribuite pentru a calcula una dintre
cele mai populare măsuri de similaritate, coeficientul Jaccard, și utilizarea aplicației pentru
evaluarea gradului de similaritate sau disimilaritate pentru nodurile din grafuri foarte mari.
Am ilustrat modul în care framework-ul Apache Hadoop și modelul de programare
MapReduce pot fi utilizate pentru un volum mare de calcule. Aplicația a fost implementată
într-un cluster Hadoop unde s-au efectuat experimente folosind un set de date din lumea reală,
în timp ce rezultatele au fost analizate și interpretate.
Bibliografie
25
[22] J. Machaj, R. Pich, and P. Brida, Rank Based Fingerprinting Algorithm for Indoor
Positioning, International Conference on Indoor Positioning and Indoor Navigation
(IPIN), pp. 1-6, 2011.
[23] L. Leydesdorff, On the Normalization and Visualization of Author Co-Citation Data:
Saltons Cosine versus the Jaccard Index, Journal of the American Society for Information
Science and Technology, 59(1): 77-85, 2008.
[24] J. Leskovec, J. Kleinberg, and C. Faloutsos, Graphs over time: Densification laws,
shrinking diameters and possible explanations, in Proceedings of the eleventh ACM
SIGKDD International Conference on Knowledge Discovery in Data Mining (KDD’05),
ACM, pp. 177–187, 2005.
[25] M. Cosulschi, M. Gabroveanu, A. Sbircea, Running Hadoop applications in
virtualization environment, Annals of the University of Craiova, Mathematics and
Computer Science Series, 39(2), pp. 322-333, 2012.
[26] M. Cosulschi, M. Gabroveanu, F. Slabu, A. Sbircea, Experiments with computing
similarity coefficient over big data, 2nd Intelligent Data Analysis with Applications in
Information Retrieval and Machine Learning, 2014, in The 5th International Conference
on Information, Intelligence, Systems and Applications (IISA 2014), IEEE, ISBN 978-1-
4799-6171-9, pp. 112-117, 2014.
[27] M. Cosulschi, M. Gabroveanu, F. Slabu, A. Sbircea, Scaling up a distributed
computing of similarity coefficient with MapReduce, Special Issue of the International
Journal of Computer Science & Applications (IJCSA2015), ISSN 0972-9038, vol.12(2),
pp. 81-98, 2015.
[28]“Web Spam Collections”, Crawled by the Laboratory of Web Algorithmics,
University of Milan, http://chato.cl/webspam/datasets/ [Online; accessed 15-June-2020].
[29] J. Kleinberg, Authoritative sources in a hyperlinked environment, Journal of the
ACM, 46(5), pp. 604-632, 1999.
26