Portal de Stiri, Platforma Hadoop
CUPRINS
LISTĂ DE FIGURI
Figură 1. Justificare dimensiune Big Data 8
Figură 2. Scalare pe verticală vs Scalare pe orizontală 11
Figură 3. Logo Hadoop 14
Figură 4. Componente Hadoop 15
Figură 5. Operația de citire din HDFS 17
Figură 6. Operația de scriere în HDFS 18
Figură 7. Exemplu MapReduce 19
Figură 8. Parser XML 24
Figură 9. Clasa ElementRădăcină.java 24
Figură 10. Clasa ElementEntity.java 25
Figură 11. Clasa ItemEntity.java 26
Figură 12. Fișier de propriețăți – conectare la baza de date 27
Figură 13. Schema bazei de date MySQL 28
Figură 14. Primele doua secțiuni din pagina principală 29
Figură 15. Ultimele două secțiuni din pagina principală 30
Figură 16. Pagina de vizualizare a unei știri 30
Figură 17. Pagina `Despre noi` 31
Figură 18. Pagina `Contact` 32
Figură 19. Pagina de autentificare în modulul de autentificare 33
Figură 20. Pagina `Dashboard` 34
Figură 21. Primul grafic din pagina `Statistici` 35
Figură 22. Următoarele grafice din pagina `Statictici` 35
Figură 23. Interfață grafică HDFS 36
CAPITOLUL 1: Introducere, obiective, motivație
Alegerea temei pentru proiectul de licență nu a fost ușoară. Ceea ce m-a determinat să aleg să construiesc un portal pentru vizualizarea știrilor a fost realizarea faptului că mediul on-line se dezvoltă din ce în ce mai mult, în zilele noastre.
De ce cu această viteză? Deoarece, în același timp, și tehnologia se dezvoltă din ce în ce mai mult și toate aceste lucruri se întâmplă pentru a veni în ajutorul oamenilor. Cum? Prin economisirea timpului. De exemplu, majoritatea oamenilor nu au timp să urmărească programele de știri difuzate la televizor, de aceea, le este mult mai ușor să fie la curent cu noutățile din țara noastră prin vizualizarea lor în mediul on-line, în pauzele de la muncă.
Cu toate acestea, un simplu portal pentru vizualizarea știrilor este destul de banal și des întâlnit. Noutatea sau îmbunătățirea pe care am vrut să i-o aduc constă în implementarea unei părți de administrare aferente, cu ajutorul căreia să se poată realiza statistici. De ce și-ar dori administratorii de astfel de portaluri de știri să genereze statistici? Răspunsul este simplu: cu ajutorul acestor statistici generate pe baza numărului de vizualizări ale știrilor și ale portalului, în general, vor putea să îmbunătățească modul de funcționare al portalului. Pe baza acestor statistici vor putea identifica care este cea mai vizualizată știre a zile/lunii/anului, să vadă categoria din care au fost vizualizate cele mai multe știri și chiar să vadă câți utilizatori au vizitat portalul pe o anumită perioadă de timp. Toate aceste statistici vin în ajutorul administratorilor de astfel de aplicații, deoarece pe baza acestor analizări pot scoate mai mult profit din aplicațiile lor și pot deveni din ce în ce mai buni pe piața mediului on-line.
Am menționat mai sus că alegerea temei nu a fost una ușoară. Spun asta pentru că am pornit această alegere de la coadă la cap. După citirea unor articole despre Big Data și Hadoop m-am decis asupra a ceea ce va reprezenta nucleul proiectului de licență, și anume: folosirea conceptului Big Data împreună cu arhitectura Hadoop. Așa că, după lungi zile în care am reușit să mă decid asupra aplicației pe care am construit-o, am definit în sfârșit tema proiectului de licență. Probabil vă întrebați cum se leagă arhitectura Hadoop de portalul de știri. Prin acele statistici, deoarece generarea lor va fi realizată cu Hadoop. Pentru o înțelegere mai bună a legăturii celor 2 părți, o să realizez în continuare, o scurtă introducere în conceptul Big Data și în arhitectura Hadoop, urmând să le dezvolt mai târziu.
Conceptul Big Data a început să devină din în ce mai folosit în domeniul IT, deoarece se poate observa ușor o creștere destul de mare a datelor cu care aplicațiile existente trebuie să lucreze și pe care trebuie să le prelucreze pentru a obține rezultatele dorite. Acest concept nu reprezintă altceva decât un set de date caracterizat printr-un volum foarte mare și o complexitate pe măsură. Big Data reprezintă, totodată și o mare problemă pentru majoritatea aplicațiilor existente. Resursele acestora și bazele de date relaționale pe care le au în spate nu reușesc să facă față acestui set de date, iar soluția la această problemă fiind înlocuirea bazelor de date relaționale cu unele nerelaționale care îndeplinesc nevoile fiecărei aplicații în parte. De ce am considerat că portalul de știri se va confrunta cu această problemă? Pentru că stocând toate aceste vizualizări pe mai multe perioade de timp mari, se va genera un set foarte mare de date cu care partea de administrare a portalului va lucra foarte greu.
Până acum am vorbit despre conceptul de Big Data și de problema care apare o dată cu acest concept, dar acum să explic și soluția pe care am găsit-o la această problemă, și anume, arhitectura Hadoop. Această arhitectură este dezvoltată de către cei de la Apache și este open-source. Ea este constituită dintr-un set de algoritmi care ajută la procesarea și stocarea setului mare de date (Big Data). Una din cele mai importante caracteristici a acestei arhitecturi este toleranța la defecte. Ce presupune acest lucru? În momentul în care se dorește stocarea unui anumit set de date, Hadoop îl stochează pe 3 noduri diferite pentru a oferi o soluție eficientă în cazul în care unul din noduri nu ar mai funcționa în mod normal și astfel datele nu s-ar mai pierde.
Un alt aspect foarte important de la Hadoop îl constituie cele 2 părți componente ale sale: HDFS și MapReduce. HDFS este un sistem de fișiere distribuit. Acest sistem stochează fișiere de dimensiuni foarte mari și tot el se ocupă de replicarea acestor fișiere pe mai multe noduri, în consecință, el realizează toleranța la defecte despre care am amintit mai sus.
MapReduce reprezintă un program care lucrează cu fișierele stocate de HDFS. Acesta este format, la rândul lui, din 2 părți: Map și Reduce. Map este o procedură care se ocupă cu sortarea informațiilor din fișiere după anumite criterii, iar Reduce este tot o procedură, însă cu alt scop. Aceasta realizează anumite operații pe care dorim să le realizăm pe fișierele obținute după sortarea făcută de procedura Map. În concluzie, MapReduce reprezintă un algoritm prin care putem manipula informațiile conținute în fișiere, în funcție de niște criterii stabilite.
Închei aici această scurtă introducere, urmând ca în continuare să prezint pe scurt conținutul lucrării de licență.
În capitolul 2, Baze de date NoSQL, studiu actual, voi analiza, pe baza cărții lui Christof Strauch, “NoSQL Databases” bazele de date nerelaționale, avantajele și dezavantajele lor. Am ales să vorbesc despre acest lucru, deoarece sistemul de fișiere distribuite de la Hadoop, HDFS, poate fi văzut ca o bază de date foarte mare, nerelațională. Tot în cadrul acestui capitol voi dezvolta conceptul Big Data.
În capitolul 3, Arhitectura software/ hardware, justificare alegere, voi detalia modul de implementare a portalului, pe partea software, urmând ca pe partea hardware să justific de ce am ales să folosesc arhitectura Hadoop și modul de a conecta mai multe mașini virtuale pentru a forma un cluster peste care Hadoop va lucra.
În capitolul 4, Implementare portal știri, voi prezenta modul de realizare a portalului de știri. Acesta va fi populat cu știri provenite de la un RSS feed. Pe lângă partea de știri pe care orice utilizator o va putea vizualiza, acest portal va avea și o parte administrativă, accesată doar de administratorul site-ului. În această parte se vor putea vedea rezultatele apărute în urma procesării fișierelor stocate de HDFS, de către MapReduce. Aceste rezultate vor fi reprezentate sub forma unor grafice și statistici realizate în fiecare zi sau o dată pe lună.
În capitolul 5, Integrare, testare, voi prezenta ce informații vor fi analizate și cum vor fi procesate de către Hadoop. Informațiile care vor fi analizate vor fi reprezentate de niște log-uri, de exemplu: numărul de useri care au vizitat portalul de știri, numărul de vizualizări al fiecărei știri, numărul de vizualizări al fiecărei categorii de știri. Ce doresc să obțin în urma acestei analize? aș dori să obțin statistici care ar putea ajuta administratorul portalului să îmbunătățească modul de funcționare al acestuia. Concret, în urma acestei analize, aș dori să obțin: numărul de useri care au vizualizat site-ul într-o zi sau într-o lună sau într-un an, ce categorie de știri a fost vizualizată cel mai des, care este știrea zilei (ce știre a fost accesată cel mai mult într-o zi). Testarea întregii aplicații constă, pe lângă realizarea testelor unitare, realizarea de teste automate și de performanță, pentru a decide dacă o astfel de implementare, care implică arhitectura Hadoop merită folosită sau nu.
În ultimul capitol, Concluzii, voi prezenta, într-un format mai larg, rezultatele obținute în urma testelor de performanță. în funcție de aceste rezultate, se va putea observa dacă astfel de soluții ce implică arhitectura Hadoop se merită a fi adoptate și de către alte firme din același domeniu sau din alte domenii.
CAPITOLUL 2: Baze de date NoSQL, studiu actual
Înainte de a vorbi despre bazele de date NoSql, aș vrea să încep prin a menționa câteva lucruri despre motivul pentru care ele se folosesc. Big Data, acesta este motivul. Ce reprezintă acest lucru? Big Data este un concept prin care este definit un set de date ce are un volum foarte mare. Din această cauză, bazele de date tradiționale încep să nu mai facă față la această provocarea de a stoca și manipula un volum mare de date. Soluția ideală ar fi stocarea acestor date în baze de date NoSql, despre care voi face o prezentare mai amplă după ce voi detalia conceptul Big Data.
Când a apărut acest concept? în opinia mea, cred că nimeni nu știe să precizeze un moment exact în care acest concept a apărut. Oamenii au început să-și dea seama de acest fenomen atunci când au observat că bazele de date relaționale pe care le aveau implementate nu mai făceau față la cererile din ce în ce mai multe de stocare și manipulare a datelor care creșteau pe zi ce trece. Pe lângă acest lucru, și-au mai dat seama și de faptul că pentru a oferi rezultate din ce în ce mai bune clienților lor, au nevoie să stocheze toate datele de pe o perioadă mai lungă de timp.
În cele prezentate mai sus am folosit de multe ori noțiunea “volum mare de date” sau “set mare de date”, însă depinde de fiecare persoană și de fiecare companie cum își definește aceste noțiuni. Pentru o mai bună înțelegere, să analizăm următoarea imagine:
Figură 1. Justificare dimensiune Big Data
Să spunem că dorim să trimitem unei cunoștințe sau unui client, printr-un e-mail, un document ce are că dimensiune 100 GB, dar acest lucru este imposibil din cauza acestei dimensiuni. în cazul de față, putem spune că pentru sistemul nostru, acest document de 100 GB poate fi considerat Big Data. Un alt exemplu ar fi următorul: avem stocată pe calculator o imagine de 100 GB și dorim să o vizualizăm însă nu putem realiza acest lucru din cauza dimensiunii imaginii. și în această situație, imaginea poate fi considerată Big Data pentru sistemul respectiv. Același lucru se întâmplă și dacă vrem să editam un video de 100 TB, însă nu ne este permisă această operație din cauza dimensiunii. Bazându-ne pe aceste exemple, putem spune că același lucru se întâmplă și în cazul companiilor. De exemplu, un set de date de 500 TB, pentru o companie poate fi considerat Big Data, iar pentru o altă companie nu. În concluzie, nu există o limită sau o dimensiune minimă de la care putem spune că un set de date poate fi considerat Big Data.
Întrebarea principală care apare în legătură cu acest concept este următoarea: de unde provin toate aceste date și într-un timp atât de scurt? Răspunsul este următorul: toate aceste date al căror volum crește pe zi ce trece, într-un timp foarte scurt, provin din două direcții: fie sunt generate de oameni, fie sunt generate de sistemele informatice. Datele generate de oameni sunt reprezentate de toate aceste e-mail-uri pe care le trimitem între noi sau toate acele like-uri și comment-uri pe care le facem pe Facebook, în principiu, sunt reprezentate de toate informațiile și mesajele pe care le schimbăm între noi. Datele generate de sistemele informatice sunt acele date generate de senzori sau toate acele log-uri provenite de la aplicațiile web.
Acest concept este foarte interesant exemplificat în cartea “Big Data. A revolution that will transform how we live, work and think”, scrisă de autorii Viktor Mayer-Schonberger și Kenneth Cukier, pe care o să le prezint pe scurt în continuare. Primul exemplu prezentat în această carte face referire la o perioadă în care gripa adusă de virusul H1N1 a contaminat o mare parte din populația lumii. Din cauza faptului că nici un antidot sau vaccin nu era făcut pentru acest tip de gripă la momentul respectiv, membrii Centrului pentru Prevenirea și Controlul Bolilor s-au gândit că cel mai bun lucru pe care îl puteau face având în vedere situația în care se aflau, era să încetinească pe cât de mult puteau răspândirea acestei gripe. Însă, pentru acest lucru era nevoie ca aceștia să știe locul în care a apărut primul caz de gripă din respectiva zonă pentru a putea preveni răspândirea ei. Resursele de care dispuneau membrii acestui centru, i-au ajutat să afle locul în care a apărut primul caz de gripă abia după câteva săptămâni de la apariția ei, ceea ce în realitate, nu era un lucru bun deloc, gripa răspândindu-se deja în cele 2 săptămâni de când apăruse. Cei care într-adevăr i-au ajutat, au fost angajații de la Google. Aceștia au spus că pot să afle unde se localizează cazurile de gripă, în timp real, din toată lumea, prin analizarea datelor stocate în urma căutărilor făcute pe Google de către oameni. Astfel, ei au reușit să implementeze un sistem care a analizat aproximativ 50 de milioane de astfel de căutări. Uitându-mă la acest exemplu, realizez că în această situație este prezent conceptul de Big Data.
După cum ne-am fi așteptat, conceptul de Big Data nu a apărut doar în domeniul medical. Autorii ne spun că în majoritatea domeniilor, oamenii s-au confruntat sau se confruntă cu problema Big Data. Astfel, ei ne mai oferă un exemplu valid, dintr-un domeniu total diferit de cel medical: domeniul achiziționării de bilete pentru călătoria cu avionul. Totul a început în momentul în care Oren Etzioni, un om de știință în domeniul calculatoarelor din America, a cumpărat un bilet online pentru o călătorie cu avionul care avea să aibă loc peste câteva luni bune. Deși mai era timp destul până la plecare, Etzioni a considerat că, achiziționând biletul mai din timp, va plăti mai puțin pe acesta.
Spre surprinderea lui, în avion a descoperit că majoritatea călătorilor își cumpăraseră biletele cu câteva zile înainte de plecare și plătiseră mai puțin decât el. Acest lucru i-a dat de gândit lui Etzioni, astfel încât a început să implementeze un sistem care putea să prezică dacă prețul unui bilet de avion avea să crească sau să scadă. Pentru acest sistem, el a adunat 12000 de prețuri de pe un site de călătorii, de pe o perioadă de 41 de zile. Sistemul lui a fost un succes, întrucât acesta a ajutat oamenii să facă mici economii când cumpărau bilete de avion.
O imagine de ansamblu foarte bună asupra a ceea ce înseamnă conceptul de Big Data și cât de repede a crescut și poate crește volumul de informație care circulă peste tot în lume în ziua de azi, ne este oferită tot în această carte. Autorii ne fac să călătorim în trecut, în perioadă celui de-al 3-lea secol I.H, când Ptolemy al II-lea al Egiptului a dorit să adune câte o copie a tuturor cărților scrise de oameni până în momentul respectiv într-un singur loc. Așa a rezultat marea Bibliotecă din Alexandria care cuprindea toate cunoștințele lumii. Întorcându-ne în zilele noastre, autorii spun că informația digitală care circulă în toată lumea este echivalentul la procesul de a da fiecărui om care trăiește pe Pământ, de 320 de ori mai multă informație față de cea care a fost stocată în Biblioteca din Alexandria. Ca o concluzie a acestei istorisiri, lucrurile se mișcă din ce în ce mai repede în zilele noastre, Așa cum spun și autorii acestei cărți, volumul informației stocate în zilele noastre crește de 4 ori mai repede decât economia lumii, iar puterea de procesare a calculatoarelor crește de 9 ori mai repede.
După prezentarea acestor câtorva exemple, autorii aduc o primă concluzie și aceea că Big Data, în esență, ține de predicții. Cu toate că de cele mai multe ori acest concept este descris că fiind o ramură a domeniului științific al computerului, numită inteligența artificială, autorii spun că această descriere este eronată, deoarece acest concept nu presupune învățarea unui calculator să gândească asemenea unui om, ci presupune modul în care se pot aplica cunoștințele matematice pe cantități mari de date pentru a oferi anumite posibilități.
Proveniența acronimului “NoSQL” nu este cunoscută de majoritatea persoanelor care îl folosesc. De cele mai multe ori, aceștia consideră că “NoSQL” provine de la “Not SQL”, lucru ce este eronat deoarece “NoSQL” provine de la “Not only SQL”. Această nouă abordare aduce cu sine și câteva avantaje care sunt foarte căutate în zilele noastre și anume: design simplu, scalare orizontală și un control mai bun al datelor.
De ce este mai bună o scalare orizontală decât una verticală, specifică bazelor de date tradiționale? Scalarea verticală presupune adăugarea de noi resurse la un singur nod din sistem, de exemplu adăugarea de mai multe placate de memorie la un singur calculator. Pe cealaltă parte, scalarea pe orizontală presupune adăugarea de noi noduri, fiecare cu propriile resurse, în sistem, de exemplu adăugarea de noi calculatoare la o aplicație software distribuită. Având în vedere cele prezentate mai sus și ținând cont de faptul că în zilele noastre volumul de date care circulă între utilizatorii sistemelor existente crește din ce în ce mai mult, putem observa clar că o abordare care implică scalarea pe orizontală este mult mai avantajoasă în cazul acesta.
Figură 2. Scalare pe verticală vs Scalare pe orizontală
În domeniul bazelor de date NoSQL s-au dezvoltăt multe astfel de baze de date. în cartea lui Christoff Strauch, “NoSQL Databases” sunt explicate cele mai folosite și cunoscute baze de date NoSQL, fiind expuse atât avantajele lor cât și dezavantajele lor, toate din privite prin prisma autorului, dar prin prisma altor persoane implicate în acest domeniu. Cartea începe cu o scurtă istorie a termenului “NoSQL”, când a fost folosit prima dată și în ce context finalizând cu o scurtă descriere a “mișcării NoSQL” dată de Eric Evans: “întregul scop în căutarea de alternative este nevoia de rezolva o problemă la care bazele de date relaționale nu se potrivesc”. În continuare, autorul ne oferă câteva exemple semnificative, demonstrând astfel cât de eficiente sunt aceste baze de date. În primul exemplu, se realizează o comparație între baza de date noSQL, Cassandra, dezvoltată de Facebook, și MySQL, rezultatul acestei comparații fiind următorul: Cassandra poate să scrie de 2500 de ori mai repede decât MySQL, o bază de date de 50 de GB. Un alt exemplu este despre Google, care poate procesa 20 de petabytes de date pe zi, date stocate în BigTable folosind abordarea MapReduce.
În anul 2000, Eric Brewer, a venit cu o așa-zisa teoremă, teorema CAP, adoptată în zilele noastre de foarte multe companii și de comunitatea NoSQL. Această teoremă susține 3 principii mari pe care bazele de date NoSQL le îndeplinesc: Consistența (Consistency), Disponibilitate (Availability) și Toleranța de partiție (Partition Tolerance). Pe scurt, fiecare dintre cele 3 principii afirmă următoarele:
Consistența: un sistem distribuit este considerat consistent, dacă după o operație de actualizare făcută de un client, ceilalți clienți îi pot vedea modificările în sursele de date partajate
Disponibilitatea: un sistem este considerat disponibil dacă este proiectat și implementat astfel încât, în cazul unor situații în care unul dintre nodurile sistemului nu mai funcționează, operațiile de citire sau scriere care erau în desfășurare să poată fi continuate fără nici un impediment
Toleranța de partiție: abilitatea unui sistem de a se adapta în situațiile în care se adaugă sau se înlătura noduri din sistem.
CAPITOLUL 3: Arhitectura software / hardware, justificare alegere
3.1 Arhitectura software
Pentru implementarea aplicației am folosit următoarele tehnologii software: Java Standard Edition 7, Hibernate, Spring MVC, JSP, HTML, CSS, Bootstrap și Hadoop, pentru partea de stocare a datelor am folosit MySQL și HBase, iar pentru partea de testare Selenium WebDriver și JMeter. Am ales aceste tehnologii deoarece sunt de actualitate și, după părerea mea, sunt foarte ușor de folosit. Pe lângă aceste lucruri, majoritatea problemelor de care te lovești folosindu-le sunt documentate cu exemple pe internet lucru ce vine în ajutorul programatorilor. Pe partea de stocare a datelor, am ales baza de date MySQL deoarece este ușor de folosit, iar conexiunea între ea și aplicație se realizează foarte ușor în Java. De asemenea, am ales baza de date NoSQL HBase, deoarece este inclusă în framework-ul Hadoop și astfel lucrul cu aceasta devine mai simplu.
Java este un limbaj de programare simplu, bazat pe clase și orientat pe obiecte, proiectat să aibă cât mai puține dependințe de implementare. Acesta se bazează pe principul “Scrie o dată, rulează oriunde” (WORA – Write Once, Run Anywhere) ceea ce înseamnă că același cod Java poate fi rulat pe toate platformele ce suportă acest limbaj fără a fi nevoie să recompilezi codul. Acest lucru este posibil deoarece aplicațiile sunt compilate în byte code care poate rula pe orice mașină virtuală Java, JVM (Java Virtual Machine) indiferent de arhitectura computerului. în anul 2015, Java a devenit cel mai popular limbaj de programare cu 9 milioane de dezvoltători ce lucrează cu acest limbaj, în special pentru implementarea aplicațiilor client-server.
Hibernate este un framework pentru limbajul Java care ajută la maparea unui model orientat pe obiect la o baza de date tradițională. Principalul lucru pe care acest framework îl realizează este maparea claselor Java la tabele din baza de date. De asemenea, acesta oferă și posibilitatea de aplicare a unor query-uri asupra datelor și de extragere a datelor din baza de date.
Spring MVC este un framework de aplicații și de inversarea container-ului de control pentru platforma Java, astfel acesta poate fi utilizat de către orice aplicație Java. Acest framework conține un set de module cu ajutorul cărora acesta oferă mai multe servicii:
autentificare și autorizare: serviciu ce oferă configurarea procesului de securitate ce suportă mai multe standarde și protocoale prin intermediul Spring Security
accesul la date: suportă comunicarea cu bazele de date relaționale cu ajutorul driver-ului JDBC, dar și cu bazele de date NoSQL
inversarea container-ului de control: permite configurarea componentelor aplicației și controlarea și manipularea ciclului de viață al obiectelor prin procesul de dependency injection
model-view-controller (MVC): framework bazat pe HTTP și servlet ce permite extinderea și customizarea aplicațiilor web și a serviciilor REST
testare: suportă clase pentru testarea unitară și de integrare.
JSP (JavaServer Pages) este o tehnologie ce permite dezvoltătorilor să creeze
dinamic pagini web bazate pe HTML, XML sau alte tipuri de documente. Pentru a rula aceste pagini este necesar instalarea unui server web, de exemplu Apache Tomcat și rularea cu ajutorul acestuia.
Bootstrap este o colecție de unelte și instrumente utilizate la crearea site-urilor și aplicațiilor web. Acest framework este open-source și oferă template-uri și teme construite cu limbajele HTML și CSS pentru butoane, controale de navigare, formulare și alte component ce pot fi afișate în paginile web. De asemenea, acesta conține și funcții Java Script pentru a introduce dinamism tuturor acestor component cu care utilizatorii interacționează prin intermediul aplicațiilor web.
Hadoop este un framework open source scris în Java pentru stocarea și procesarea distribuită a unui set mare de date, Big Data. Acest framework lucrează pe un cluster de mașini, fiecare dintre ele având o configurație hardware medie. Un mare avantaj pe care îl deține Hadoop este faptul că acest cluster de mașini pe care el lucrează, scalează pe orizontală. După cum am prezentat și mai sus, scalarea pe orizontală aduce cu sine și în cazul de față mai multă putere de computație și mai mult spațiu de stocare, eliminând astfel nevoia de a achiziționa mai multe mașini cu o configurație hardware cu mult peste medie, de genul supercalculatoarelor.
Înainte să încep expunerea mai detaliată a lui Hadoop, voi relata pe scurt, istoria acestuia. “Părintele” acestui framework a fost dezvoltată de cei de la Google. Ei au implementat un sistem de fișiere distribuit, Google File System, și sistemul MapReduce cu care aceștia reușeau să proceseze toate datele și să ofere răspunsul căutat de fiecare utilizator într-un timp foarte scurt. Cu ajutorul acestui sistem, Google a reușit să devină cel mai popular motor de căutare. Dorind să împărtășească module de proiectare a acestui sistem cu persoanele interesate de acest domeniu, aceștia au scos o documentație oficială pentru Google File System și pentru MapReduce. Doi angajați de la Yahoo s-au folosit de această documentație și au implementat framework-ul Hadoop. De unde vine acest nume și acest logo al framework-ului? Unul din cei doi dezvoltători s-a folosit de jucăria băiețelului sau, un elefant, pe care îl numise Hadoop.
Figură 3. Logo Hadoop
La aproximativ un an de la dezvoltărea lui Hadoop, cei de la Yahoo îl donează companiei Apache și începând cu acel moment și până în momentul de față, Hadoop este dezvoltat de către aceștia.
Un alt avantaj al acestui framework este faptul că datele pot fi stocate pe o perioadă mai lungă de timp. De exemplu, în momentul de față, majoritatea companiilor stochează log-urile generate de aplicațiile web pe o perioadă de aproximativ 3 luni, după care acestea sunt rescrise. Cu Hadoop, aceste log-uri pot fi stocate pe o perioadă mult mai lungă decât 3 luni și astfel o analiză mai amănunțită asupra acestora se poate realiza. De asemenea, folosirea acestui framework nu necesită costuri mari deoarece acesta este open-source. Singurele costuri pe care companiile vor trebui să le acopere sunt acelea pentru construirea unui cluster de mașini, depinzând de mărimea cluster-ului necesar (dacă acest cluster va avea 10 noduri, costurile vor fi mici, dacă va avea 1000 de noduri, atunci costurile vor crește semnificativ).
Hadoop are două mari părți principale: HSDF – Hadoop Distributed File System (sistem de fișiere distribuit) și MapReduce, astfel că el poate fi asemănat cu o monedă cu cele două fețe ale sale, partea de stocare și partea de procesare.
Figură 4. Componente Hadoop
HDFS reprezintă partea de stocare a ecosistemului Hadoop, asigurând dezvoltătorilor spațiu de stocare nelimitat. La rândul lui, acest sistem de fișiere are avantajele sale. Unul din cele mai importante este acela că scalează pe orizontală, ceea ce înseamnă că sunt mii de servere ce pot stoca petabytes de date (petabyte = unitate de măsură a capacității de stocare a datelor echivalentă cu 2 la puterea 50 bytes). în momentul în care este nevoie de mai mult spațiu de stocare nu se vor adopta soluții costisitoare ci se vor adăuga alte servere. După cum am menționat și mai sus, întreg ecosistemul Hadoop, însemnând că și HDFS, lucrează pe mașini cu o configurație medie rezultând un cost mai scăzut pentru companii. Cel mai important avantaj pe care îl oferă acest sistem de fișiere distribuit este reprezentat de toleranța la defecte. Să presupunem că avem un cluster de mașini cu 10 noduri și observăm că la un moment dat unul din noduri nu mai funcționează. La prima vedere, acest lucru ar putea reprezenta o mare problemă, deoarece teoretic, toate datele stocate pe acel nod s-au pierdut în momentul în care acesta a încetat să funcționeze. Utilizând Hadoop nu mai trebuie să ne îngrijorăm pentru acest lucru deoarece toate modulele ce fac parte din acest ecosistem știu să facă față la astfel de situații. Datele nu vor mai fi pierdute deoarece HDFS este proiectat să replice toate seturile de date pe 3 noduri (acest număr de replicare este setat implicit la valoarea 3, însă poate fi modificat să ia orice valoare dorim noi). Astfel, în situația prezentată mai sus, datele nu au fost pierdute, deoarece ele erau replicate pe 3 noduri. în momentul în care unul din cele 3 noduri nu mai funcționează, HDFS se asigură că datele rămase pe celelalte 2 noduri să fie disponibile tot pe 3 noduri, replicând astfel setul de date pe un alt nod funcțional din cluster. Un alt lucru foarte important este că HDFS se bazează pe un model simplu de coerentă: “scrie o dată, citește de mai multe ori” și pe faptul că datele nu pot fi modificate, ele pot fi doar scrise sau șterse.
Arhitectura acestui sistem de fișiere nu este una complexă, ea având la bază un singur NameNode și mai multe noduri de date, DataNodes. Namenode-ul stochează toate fișierele de sistem sub formă de meta data, în memorie. Astfel el conține locațiile replicilor și ale chunk-urilor de fișiere (chunk-ul este un fragment dîntr-un fișier, pentru versiunea Hadoop 2 având dimensiunea de 128 de MB) și nu conține alte informații despre fișierele stocate. La un anumit interval de timp, Namenode-ul așteaptă un mesaj de tip HeartBeat (un semnal care confirmă faptul că nodul încă funcționează) de la fiecare nod de date și în cazurile în care unul dintre noduri nu funcționează se ocupă de re-replicarea datelor de pe acel nod. Nodurile de date stochează propriu-zis chunk-urile de fișiere. Ele răspund la cererile făcute de client și execută comenzile primite de la Namenode (comenzi de ștergere, de redenumire). în același timp, acestea trebuie să trimită constănt mesaje de tip HeartBeat pentru a notifica Namenode-ul că funcționează.
În continuare, o să explic pe scurt cum se realizează operațiile de citire și de scriere în HDFS:
Figură 5. Operația de citire din HDFS
După cum se poate vedea și în imaginea de mai sus, operația de citire din HDFS este un simplă. Clientul face o cerere de citire a unui fișier și primește că răspuns locațiile chunk-urilor care fac parte din fișierul respectiv. Acest răspuns este dat de către Namenode deoarece doar el conține aceste informații. După primirea răspunsului, clientul alege primul nod de date pentru fiecare bloc și începe citirea acestora secvențial. O altă proprietate a ecosistemului Hadoop foarte utilă este aceea de caching. După primirea răspunsului dat de Namenode cu locațiile chunk-urilor de fișiere, acesta se cache-uieste astfel încât, dacă același client dorește să mai citească o dată același fișier, nu va mai trebui să interogheze Namenode-ul despre locația unde poate găsi fișierul, ci le va accesa direct.
Operația de scriere în HDFS este mai complexă decât cea de citire. După cum putem observa și în imaginea de mai jos, clientul inițiază o cerere de scriere a unui fișier în HDFS către Namenode. Acesta din urmă îi răspunde oferindu-i locațiile nodurilor disponibile din sistem (în imagine, clientului i se oferă 3 noduri, deoarece factorul de replicare are valoarea 3). După ce primește răspunsul, clientul începe operația de scriere, iar fișierul se va scrie pe blocuri (chunk-uri). Primul bloc se va scrie pe primul nod de date (de obicei este cel mai apropiat de client), urmând că replicarea pe celelalte două noduri să se facă de către acesta. Practic, clientul scrie blocul de date pe primul nod. Acesta copiază blocul de date local și îl trimite către următorul nod de date. La rândul lui, al doilea nod de date copiază local chunk-ul de fișier și îl trimite către ultimul nod de date care va stoca și el local fragmentul de fișier. Același lucru se întâmplă și cu următoarele blocuri.
Figură 6. Operația de scriere în HDFS
Toate lucrurile pe care le-am prezentat mai sus reprezintă avantaje solide ale ecosistemului Hadoop, însă, la rândul lui are și câteva dezavantaje. Cel mai mare dezavantaj este acela că un singur nod deține toate informațiile importante despre nodurile de date, locațiile chunk-urilr de fișiere și ale replicilor. Ce se întâmplă dacă acest nod, Namenode-ul, nu mai funcționează? Teoretic, toate aceste informații stocate pe acest nod vor fi pierdute, iar cluster-ul nu va mai funcționa. Pentru a rezolva această problemă, în versiunea Hadoop 2, nodul Secondary Namenode a fost implementat să fie că o oglindă a nodului Namenode. Astfel că, în cazul în care Namenode-ul nu va mai funcționa, el va putea fi repus în funcțiune pe baza informațiilor stocate în Secondary Namenode.
MapReduce este un program folosit pentru procesarea și generarea unor seturi mari de date folosind un algoritm paralel distribuit pe cluster. Acest program este compus din două proceduri: Map() și Reduce(). Procedura Map() realizează operații de filtrare și sortare, iar procedura Reduce() realizează operații sumare, de exemplu numărarea studenților după un anumit criteriu etc. MapReduce lucrează numai cu perechi <cheie, valoare> primind că intrare date de această formă și generând la ieșire date sub aceeași formă. De asemenea, el se bazează pe programarea funcționala, în sensul că datele generate nu pot fi modificate, ci doar șterse și permite și adăugarea de noi date la setul generat. MapReduce citește datele din HDFS, însă le poate citi și din alte locuri: baze de date, sisteme de fișiere locale etc. Acest framework se ocupă și de distribuirea procesării datelor pe nodurile din cluster. De menționat este faptul că, avantajele cele mai importante ale acestui framework nu sunt procedurile Map() și Reduce(), ci faptul că este scalabil și că are toleranță la defecte. Astfel că, implementând acest program pe un cluster ce conține un singur nod, MapReduce nu va procesa mai rapid datele decât un program tradițional diferit de acesta. Performanțele framework-ului se vor vedea abia la un cluster ce conține câteva zeci de noduri. Un alt lucru important de menționat este faptul că în momentul în care unul din nodurile cluster-ului nu mai funcționează, iar pe acesta aveam în desfășurare programul MapReduce, Hadoop știe să mute procesarea care se realiza pe nodul căzut pe un altul funcțional astfel încât rezultatul să nu fie afectat. De asemenea, Hadoop știe și să combine rezultatele, oferind clientului răspunsul dorit.
Pentru o înțelegere mai bună a modului de funcționare al acestui framework, propun să analizăm următoarea imagine:
Figură 7. Exemplu MapReduce
În imagine avem exemplificat o operație de contorizare a numărului de apariții al fiecărui cuvânt dîntr-un fișier dat că intrare. în fișierul de input avem cuvinte pe trei linii. în exemplul de față, clusterul de mașini conține trei noduri, de aceea, în etapa de împărțire (Spritting) fișierul este împărțit între cele trei mașini, fiecare linie din fișier fiind alocată unui nod (implicit, împărțirea fișierelor se face după terminatorul de rând, însă valoarea acestui delimitator se poate modifica). Următoarea etapă este cea de mapare (Mapping) în care cuvintelor de pe fiecare nod li se asociază o valoare, ele reprezentând cheia din perechea <cheie, valoare> = <cuvânt, valoare>. în etapa de Shuffling se realizează o oarecare sortare după cheile existente, determinând setul de date pe care procedura Reduce() poate fi aplicată. Numărul de proceduri Reduce() ce trebuie rulate este dat de numărul de chei găsite, iar numărul de proceduri Map() este dat de numărul de mașini din cluster. După terminarea rulării procedurilor de Reduce(), rezultatul final va conține numărul de apariții al fiecărui cuvânt din fișierul inițial.
Pe lângă HDFS și MapReduce, ecosistemul Hadoop conține și alte module: HBase, Zookeeper, Hive, Pig, YARN (Yet Another Resource Negociator). HBase este baza de date asociată framework-ului Hadoop și este folosită pentru stocarea seturilor de date de tip Big Data, conținând milioane de coloane și miliarde de rânduri. Această bază de date nu este una relațională și poate servi drept input și output pentru framework-ul MapReduce. Cel care unește toate modulele ecosistemului și le ajută să lucreze împreună este Zookeeper-ul. Acesta este un serviciu centralizat ce menține informațiile de configurare și oferă sincronizare distribuită. YARN – Yet Another Resource Negociator este folosit pentru programarea job-urilor de MapReduce pentru managementul clusterului de mașini.
3.2 Arhitectura hardware
După cum am menționat și mai devreme, Hadoop lucrează pe un cluster de mașini. Pentru a integra acest framework cu aplicația pe care am dezvoltăt-o am configurat un cluster de 4 mașini virtuale, aflate pe 2 mașini fizice. Pe fiecare mașină virtuală am instalat o distribuție de Linux, Ubuntu și framework-ul Hadoop.
Linux este un sistem de operare open-source. Componenta principală a acestui sistem de operare este nucleul Linux (Linux kernel), lansat pentru prima oară în anul 1991 de către Linus Torvalds. Inițial, Linux a fost dezvoltat ca un sistem de operare gratis pentru calculatoarele personale și era bazat pe arhitectura Intel x86. Din momentul lnasării însă, acesta a fost portat pe mai multe platforme hardware decât orice alt sistem de operare. Dezvoltarea acestui sistem sistem de operare nu este făcută doar de o singură persoană, ci printr-o colaborare a mai multor dezvoltatori. În esență, Linux conține mai multe pachete sau distribuții, astfel că el mai este numit și distribuția Linux, folosită atât pentru desktop, cât și pentru partea de server. Cele mai importante distribuții de Linux sunt: Debian, Ubuntu, Linux Mint, Fedore, Red Hat Enterprise Linux. Acest sistem de operare este portat pe foarte multe platforme hardware, cu diverse configurații. Linux poate rula pe telefoane mobile, dar și pe super calculatoare.
Ubuntu este un sistem de operare bazat pe distribuția Linux, Debian. Numele acestuia provine de la o ideologie provenită din Africa de Sud, numită “ubuntu” și care înseamnă “credința într-o legătură universală ce unește întreaga omenire”.
Pentru configurarea ecosistemului a fost nevoie de parcurgerea mai multor pași, cum ar fi:
1. Alocare IP static pe fiecare mașină pentru a le putea trece în fișierul slaves din Hadoop
2. Configurare fișier /etc/hosts pentru a putea folosi comanda ping cu numele mașinii și nu doar cu IP-ul acesteia
De exemplu : ping slave1 ( ping 192.168.0.121 )
3. Instalare Open ssh server
Se va scrie comanda : sudo apt-get install openssh-server .
Se poate verifica cu comanda : ssh slave1@slave1PC .
4. Configurare mașini astfel încât să putem iniția o conexiune ssh fără a introduce parola, între mașinile din cluster
Se vor scrie următoarele comenzi, pe rând:
ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh-copy-id -i ~/.ssh/id_rsa.pub slave1PC
5. Dezactivare protocol IP v6, deoarece framework-ul Hadoop folosește adresa 0.0.0.0 pentru mai multe configurări și astfel ar putea apărea confuzia că aceasta ar aparține unui spațiu
Se va scrie următoarea comandă: sudo vim /etc/sysctl.conf
În acest fișier, se vor adăuga următoarele linii:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Se poate verifica folosind următoare comandă:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
Dacă valoarea returnată este 1, protocolul a fost dezactivat.
6. Descărcare Hadoop
7. Creare foldere pentru Hadoop: hdfs, name, data, tmp
8. Instalare Java (dacă nu este instalată):
Se va folosi următoarea comandă:
sudo apt-get install openjdk-7-jdk
9. Se adaugă variabile de mediu (environment variables) în ~/.bashrc
În acest fișier, se vor introduce următoarele linii:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIRE=$HADOOP_INSTALL/lib/native
Pentru că modificările făcute să fie aplicate, se va executa comanda:
exec bash
10. Configurare fișiere xml pentru Hadoop:
core-site.xml, yarn-site.xml, mapred-site.xml, hdfs-site.xml
11. Adăugare noduri de date în fișierul slaves din Hadoop
12. Formatare Namenode
Se va introduce următoarea comandă:
hadoop namenode -format
13. Pornire daemoni :
Pentru acest lucru, se vor utiliza următoarele comenzi:
start-dfs.sh, start-yarn-sh
CAPITOLUL 4: Implementare portal știri
4.1 Portalul de știri
În momentul în care am început să proiectez acest portal de știri, a trebuit în primul rând să caut o sursă de la care puteam să preiau, în mod constănt, știrile din fiecare zi. Cea mai simplă modalitate de preluare a acestor știri și care nu necesită autorizație a fost accesarea unui link către o pagină web ce conține un RSS feed. Ce este acest RSS feed? Acest feed oferă informații complete sau sumare, dar cu referință către conținutul complet al datelor, sub formă de fișier XML, despre știri, blog-uri web etc. în zilele noastre, majoritatea site-urilor ce conțin știri oferă un link către un astfel de RSS feed. Astfel că, având de ales între mai multe surse, am ales să folosesc RSS feed-ul de la site-ul de știri http://stirileprotv.ro .
După asigurarea sursei de informație, a trebuit să aleg o metodă de implementare prin care puteam să mă folosesc de informațiile din acest feed pentru a le putea afișa în aplicația mea. Fiind un fișier xml, singura cale de extragere a informațiilor din el, a fost implementarea unui parser de fișiere xml. Pentru a fi la curent cu cele mai noi știri apărute, am renunțat la varianta stocării feed-ului local și am adoptat soluția parsarii feed-ului accesându-l direct de pe link-ul http://rss.stirileprotv.ro/ .
Pentru implementarea parser-ului de fișiere XML am construit clasa XMLParser.java. în această clasă, am preluat fișierul xml de pe link-ul http://rss.stirileprotv.ro/ și am mapat și extras nodurile ce conțineau informații sau date pe care am hotărât să le afișez în aplicația mea.
Figură 8. Parser XML
În imaginea de mai sus se poate observa modul de preluare al fișierului xml de pe link-ul ce conține RSS feed-ul și apoi obținerea unei liste a tuturor nodurilor din interiorul tag-ului numit “channel”, care este următorul nod după nodul rădăcină. Următoarea etapă în parsarea fișierului a fost setarea denumirii elementului rădăcină, necesar deoarece în cadrul acestui element am strâns toate informațiile obținute de la celelalte noduri din fișierul xml. De menționat este faptul că pentru stocarea informațiilor luate din nodurile fișierului am construit mai multe clase: ElementRadacina.java, ElementEntity.java, ItemEntity.java.
Fiecare din aceste clase a fost folosită pentru maparea informațiilor existente în nodurile din feed: ElementRadacina.java a fost folosită pentru maparea denumirii nodului rădăcină și pentru a specifica faptul că va conține o listă de elemente de tipul ElementEntity.
Clasa ElementEntity.java mapează informațiile despre RSS feed-ul: titlul, link-ul, data publicării etc și conține și o listă de elemente de tipul ItemEntity.
ItemEntity.java conține informații despre știrile propriu-zise: titlul știrii, link-ul pentru mai a putea vizualiza conținutul complet al știrii, o descriere sumară, data publicării știrii, categoria din care face parte fiecare știre și o imagine specifică fiecărei știri. Tot în această clasă am adăugat un element nou, un id cu o valoare unică pentru fiecare știre în pare. Acest parametru l-am folosit pentru a putea ști tot timpul ce știre a fost vizualizată, ce știre a fost accesată de utilizatori.
După setarea denumirii elementului rădăcină cu ajutorul unei variabile de tipul ElementRadacina se începe parcurgerea nodurilor existente în fișierul xml. După obținerea nodurilor copil din interiorul unui nod părinte, se setează cu ajutorul claselor ElementEntity sau ItemEntity, toate informațiile găsite în acele noduri:
elementEntity.setDescription(channel
.getElementsByTagName("description")
.item(0).getTextContent());
După setarea tuturor acestor elemente, acestea se adaugă în lista de elemente de tipul ElementEntity care se atașează mai apoi, elementului rădăcină. La finalul acestei metode, se va returna elementul rădăcină care va conține toate informațiile despre știrile existente în RSS feed.
După implementarea acestei metode, am construit o clasă controller HomeController.java pentru a salva datele preluate din fișierul xml în baza de date și pentru a le afișa apoi într-o pagină web pe care un utilizator obișnuit o va putea accesa. în ceea ce privește baza de date, pentru a salva toate aceste știri am ales să folosesc o bază de date relațională, MySQL. Pentru a realiza conexiunea dintre aplicație și aceasta am folosit un fișier de proprietăți database.properties ce conține url-ul la care poate fi accesată baza de date, numele utilizatorului și parola acestuia pentru autentificarea la baza de date:
Datele preluate din fișierul xml au fost salvate în baza de date în două tabele: `article` și `image`. Aceste două tabele sunt mapate la rândul lor, de două clase java: ItemEntityDB.java pentru tabela `article` și ImageEntityDB.java pentru tabela `image`. Pentru a afișa știrile în portal am avut nevoie să salvez informațiile despre acestea în următoarele câmpuri din baza de date: în tabela `article` am configurat câmpurile `id_article`, `title`, `category`, `description`, `pub_date`, `id_image` și `read_more_link`, iar în tabela `image` am utilizat câmpurile `id_image` și `link`. Între cele două tabele există relația de one-to-many ( `image` – `article`), iar acest lucru este marcat prin existent unei chei străine în tabela `article`, și anume `id_image`.
Figură 13. Schema bazei de date MySQL
După cum am menționat mai sus, după salvarea tuturor informațiilor în baza de date, am implementat o metodă prin care să le extrag din aceasta și să le afișez în portal. De ce am folosit și o bază de date? Pentru a putea oferi utilizatorului posibilitatea să vizualizeze știri mai vechi și nu doar pe acelea din ziua curentă și pentru a putea realiza o analiză mai amănunțită cu ajutorul framework-ului Hadoop, însă mai multe detalii despre partea această vă voi oferi mai târziu. Tot acest proces de afișare pornește de la pagina web. în momentul în care aceasta este accesată, browser-ul realizează un request GET pentru a primit datele necesare pentru a afișa conținutul paginii web. Când se inițiază acest request, în backend se va apela metoda de extragere a informațiilor din baza de date și apoi se vor putea afișa în pagina web. Pentru stilizarea aplicației am ales să utilizez o temă de la Bootstrap, gratuită, o temă simplă și ușor de folosit, care vine în ajutorul utilizatorului reușind să scoată în evidență cele mai noi știri, dar și să ofere posibilitatea de a vizualiza știri mai vechi. De asemenea, pagina principală este structurată astfel încât să aibă un aspect cât mai aerisit, nu foarte încărcat, afișând doar titlurile știrilor și oferind o modalitate de a citi întreaga știre într-o altă pagină, astfel pagina principal nu va fi încărcata cu foarte mult conținut. Principalele secțiuni pe care un utilizator le poate vedea în pagină principală sunt următoarele: secțiunea de antet (header) care conține un link către pagina principal: `ACASA` și alte două link-uri: `DESPRE NOI`, în care se oferă informații generale despre portalul de știri și `CONTACT`, unde se pot găsi date de contact ale portalului, de exemplu: adresa, numărul de telefon etc. O altă secțiune din această pagină este reprezentată de un carusel în care sunt afișate toate știrile, pornind de la cele mai noi. Acesta rulează automat, la un interval de 5 ms. Consider că acest carusel vine în ajutorul utilizatorului oferindu-i un oarecare rezumat asupra lucrurilor importante, care au devenit știri și care s-au întâmplat în ultimul timp (raportat la data curentă). A treia secțiune este reprezentată de o listă a celor mai recente șase știri. în această secțiune, fiecare știre este afișata într-o căsuță în care se pot vedea titlul știrii, imaginea asociată acelei știri, categoria din care face parte știrea și o scurtă descriere despre respective știre. De asemenea, tot în această căsuță, există și un buton numit `Mai multe` pentru a oferi utilizatorului posibilitatea de a vizualiza întreaga știre. Prin apăsarea acestui buton, userul este direcționat către o pagină nouă în care este afișat întreg conținutul știrii. Ultima secțiune din pagina principal este reprezentată de un buton numit `Mai multe știri` pentru a permite utilizatorului să vizualizeze știri mai vechi. Prin apăsarea acestui buton, vor fi afișate în pagina principala încă șase știri, în continuarea celor afișate deja. Mai multe detalii despre modul în care este structurată această pagină se pot observa în următoarea imagine:
Figură 14. Primele doua secțiuni din pagina principală
Figură 15. Ultimele două secțiuni din pagina principală
Am menționat mai devreme că dând click pe butonul `Mai multe` pentru o știre vom fi redirecționați către o nouă pagină în care putem vedea întreg conținutul știrii. Această pagină are o structură simplă, fiind compusă doar din două secțiuni. Una din cele două secțiuni este header-ul descris mai sus, acesta fiind comun tuturor paginilor portalului. A doua secțiune afișează o descriere sumară a știrii și imaginea asociată știrii respective. Pentru a fi posibilă această redirecționare, am folosit acel parametru `item_id` din clasa `ItemEntity.java`. Acesta a fost utilizat pentru a ști cu exactitate ce știre e asociată butonului `Mai multe` care a fost apăsat pentru a afișa conținutul corespunzător acelei știri. Funcționalitatea din spatele interfeței grafice a fost implementată cu ajutorul unei funcții Java Script folosind o cerere de tipul AJAX.
Figură 16. Pagina de vizualizare a unei știri
În cadrul portalului de știri mai există două pagini care conțin date cu scop informativ. Una dintre pagini prezintă o scurtă descriere despre acest portal de știri, istoria lui și alte informații generale despre el, iar cealaltă pagină conține date de contact ale portalului: adresa de e-mail, adresa sediului unde se redactează știrile, număr de telefon etc.
Figură 17. Pagina `Despre noi`
Figură 18. Pagina `Contact`
4.2 Modulul de administrare al portalului
Având în vedere faptul că majoritatea aplicațiilor web au asociat un modul de administrare, am considerat că partea de analiză a datelor achiziționate din acest portal să fie făcută în cadrul unui modul de administrare. Accesul la acest modul îi este permis doar unui administrator autorizat și acesta poate accesa această parte din aplicație doar autentificându-se cu un nume de utilizator și o parolă private. Credentialele acestui cont se introduc într-o pagină web nouă, care apare în aplicație că în imaginea următoare:
Figură 19. Pagina de autentificare în modulul de autentificare
Stilizarea acestei pagini și a întreg modului de administrare am realizat-o folosind o altă temă gratuită, oferită de Bootstrap. Tema pe care am ales-o se potrivește scopului pentru care am implementat acest modul oferind multe exemple de grafice și statistici ce pot fi folosite pentru a afișa într-un mod cât mai interactiv rezultatele analizelor făcute cu ajutorul framework-ului Hadoop.
Prima pagină care va apărea administratorului este cea numită `Dashboard`. Este numită în acest fel deoarece conține informații despre portal reprezentate într-un mod în care administratorul poate urmări evoluția datelor. Astfel că, un administrator care va intra pe această pagină va putea observa un graphic în care sunt afișate informații despre numărul de vizualizări înregistrate din portal în fiecare lună a anului curent. Aceste informții sunt calculate în mod automat de către un job de MapReduce, numit SesiuniMapReduce.java. În această clasă sunt realizate procedurile Map() și Reduce(), dar și metoda principală în care acestea sunt apelate. În această metodă se realizează conexiunea la baza de date HBase specificându-se și tablea în care sunt stocate datele necesare rulării job-ului de MapReduce. Tot aici se specifică și calea unde fișierul de output, rezultat în urma rulării job-ului, poate fi stocat. De remarcat la acest modul de administrare este partea de antet (header) unde putem găsi un nume generic dat modulului de administrare : `Admin Panel`. Lângă acest nume există un buton care arată sau ascunde un meniu ce conține două opțiuni: `Dashboard` și `Statistici`. Tot în antetul acestei pagini găsim și un buton de delogare din acest modul de administrare. Un alt element ce apare în această pagină este un calendar ce poate fi de ajutor utilizatorului în urmărirea evoluției datelor achiziționate din portalul de știri. Pentru o mai bună înțelegere, să urmărim imaginea de mai jos:
Figură 20. Pagina `Dashboard`
Spuneam mai sus că meniul, aflat în partea stângă a ecranului, conține două opțiuni: `Dashboard` și `Statistici`. Prima opțiune este reprezentată chiar de prima pagină a acestui modul de administrare, iar cea de-a doua este reprezentată de o altă pagină ce conține trei statistici. Toate aceste statistici sunt reprezentate sub forma unor grafice. Acestea vin în ajutorul administratorului deoarece, prin modul în care ele reprezintă informațiile din portal, oferă o mai bună perspectivă a evoluției acestora. Ce fel de statistici putem găsi în această pagină? După cum am mneționat, în această parte a modulului se găsesc trei statistici care reprezintă rezultatele următoarelor analizări: primul grafic prezintă numărul de vizualizări al fiecărei știri din portal. Deoarece titlul unor știri poate fi destul de lung, am ales să reprezint în acest grafic id-ul știrilor, reprezentând alături un tabel care afișează titlurile știrilor asociate id-urilor ce se găsesc în grafic. Al doilea grafic afișează numărul de vizualizări al portalului în fiecare zi, iar ultimul grafic reprezintă numărul de vizualizări al fiecărei categorii. Pentru a putea avea o idee mai clară despre toate aceste grafice, să privim imaginile următoare:
Figură 21. Primul grafic din pagina `Statistici`
Figură 22. Următoarele grafice din pagina `Statictici`
CAPITOLUL 5: Integrare, testare
5.1 Integrare
Pentru a putea lucra cu Hadoop și cu sistemul de fișiere distribuit, HDFS, direct din Eclipse a fost nevoie de integrarea unui plugin, special conceput pentru lucrarea cu Hadoop și HDFS, numit `Map/Reduce`. Acest plugin poate fi configurat astfel încât se poate specifica IP-ul la care se găsește nodul master al cluster-ului precum locația unde se află sistemul de fișiere distribuit.
După ce toate aceste configurări sunt realizate se poate deschide o nouă perspectivă în proiect și astfel, toate fișierele și informațiile conținute de HDFS vor fi afișate prin intermediul acelei perspectivi. Acest lucru este de foarte mare ajutor programatorilor deoarece după fiecare modificare și rulare a unui job de MapReduce, aceștia pot vizualiza rezultatele direct din Eclipse, fără a fi nevoie să acceseze adresa la care se găsește HDFS. De asemenea, aceștia pot și încărca fișiere direct din mediul de lucru Eclipse, iar acestea vor fi încărcate automat pe sistemul de fișiere distribuit prin intermediul acestui plugin.
După cum am menționat mai sus, conținutul acestui sistem de fișiere poate fi accesat și prin accesarea unei adrese ce conține o interfață grafică în care sunt afișate toate aceste informații. Tot în această interfață se pot vedea și care sunt replicile fiecărui chunk dintr-un fișier.
Figură 23. Interfață grafică HDFS
5.2 Testare
Pentru a oferi utilizatorilor siguranța că produsul realizat, în cazul de față, portalul de știri implementat, este un produs ce prezintă un grad ridicat de calitate și de încredere, am supus această aplicație unor teste realizate cu ajutorul framework-ului Selenium WebDriver ( teste automate) și cu ajutorul framework-ului JMeter ( teste de performanță ).
Selenium este un framework de testare a aplicațiilor web, portabil, ce poate fi rulat pe majoritatea browser-elor și folosit pe majoritatea sistemelor de operare. Acest framework conține mai multe component:
Selenium IDE: un mediu de dezvoltăre integrat pentru testele făcute cu Selenium. Este implementat că o extensie a browser-ului Firefox și permite înregistrarea, editarea și investigarea testelor. Scripturile de test sunt înregistrate în Selenese, un limbaj special pentru realizarea scripturilor în Selenium. Acest limbaj oferă comenzi pentru realizarea anumitor acțiuni în browser: apăsarea unui buton, selectarea unei opțiuni, introducerea unei valori etc și pentru obținerea datelor din paginile accesate.
Selenium Client API: reprezintă o alternativă la scrierea testelor în Selenese, aceste teste putând fi scrise și în alte limbaje de programare. Momentan, Selenium Client API oferă interfețe pentru scrierea testelor pentru următoarele limbaje: Java, C#, Ruby și Python.
Selenium Remote Control: este un server, scris în Java care permite scrierea testelor automate pentru aplicațiile web în orice limbaj de programare: PHP, Python, Ruby, .NET, Perl și Java.
Selenium WebDriver: este succesorul lui Selenium Remote Control. Acesta acceptă comenzi trimise în Selenese sau prin Client API pe care le trimite către un browser. în momentul de față, Selenium WebDriver este complet implementat și suportat în limbajele de programare: Python, Ruby, Java și C#.
Pe lângă aceste componente, există și câteva instrumente ce ajută la rularea mai ușoară a testelor automate: Jenkins, Grails, Apache Maven etc.
JMeter este un proiect de la Apache folosit pentru a realiza teste de încărcare a site-urilor web și de măsurare a performanței lor. Acesta poate fi configurat astfel încât să simuleze accesarea aplicațiilor de către un anumit număr de utilizator, în acest fel reușind să măsoare performanța aplicațiilor respective.
Cu ajutorul acestor teste, am reușit să identific dacă existau probleme majore ce nu permiteau utilizatorului să folosească aplicația, dar și probleme de încărcare a aplicației și de operare cu aceasta.
CAPITOLUL 6: Concluzii
Acest domeniu al datelor de dimensiuni foarte mari, Big Data, și al procesării lor m-a fascinat foarte mult. Cel mai mult m-a impresionat rapiditatea cu care toate aceste date și informații se generează și cum oamenii au găsit soluții care, cu aproximativ aceeași rapiditate, toate aceste date se pot stoca și procesa.
Ceea ce pe de o parte mă sperie, iar pe altă parte mă fascinează este faptul că această creștere nu se va opri și o dată cu acest lucru nici rapiditatea cu care se dezvoltă tehnologiile în zilele noastre nu va scădea. Astfel că, cine știe, poate la un moment dat chiar vom ajunge ca în filmele science fiction, niște oameni cu microchip-uri implantate, adică un fel de roboți.
Consider că scopul aplicației pe care am implementat-o, împreuna cu modulul de administrare, a fost atins. Mai mult decât atât, consider că această aplicație poate fi folosită și în alte domenii sau pentru alte scopuri, diferite de cel de administrare al unui portal de știri. De exemplu, poate fi folosită pentru analizarea rezultatelor achiziționate în urma efectuării unui recensământ sau în urma unui sondaj de opinie realizat pe un eșantion foarte mare de oameni.
În ceea ce privește utilizatorii finali care se vor folosi de această aplicație, vor fi mulțumiți de aceasta deoarece le oferă posibilitatea de a rămâne la curent cu cele mai noi știri, iar pe administrator îl ajută să îmbunătățească modul în care arată portalul, astfel încât acesta să aibă cât mai multe vizualizări. Îl ajută în sensul că, realizându-se acele statistici, administratorul poate observa ușor dacă într-o perioadă numărul de vizualizări a scăzut și poate realiza astfel că în portal pot exista anumite lucruri ce nu sunt pe placul celorlalți utilizatori. De asemenea, acesta poate vedea ce categorie de știre a fost vizualizată cel mai des și, pentru a atrage cât mai mulți vizitatori ai site-ului, poate colecta mai multe știri care fac parte din această categorie și poate afișa acele știri pe primele rânduri din pagina portalului.
O concluzie generală care reiese în urma realizării acestui proiect ar fi aceea că suntem înconjurați de miliarde de date care, surprinzător sau nu, sunt generate de noi, oamenii, și nu de mașinăriile informatice. Din cauza acestui lucru (sau datorită), domeniul acesta precum și cel al procesării și manipulării acestor date va fi unul de viitor, iar eu personal, mă bucur că am reușit să realizez acest proiect și să învăț atât de multe lucruri despre aceste domenii.
ANEXE
1.Clasa java pentru parsarea fișierului xml, a RSS feed-ului: XMLParser.java
Clasa controller pentru salvarea informațiilor și extragerea lor din baza de date și trimiterea lor în urma request-ului pentru afișarea lor în pagina web: HomeController.java
Clasa SesiuniMapReduce.java pentru realizarea job-ului de MapReduce ce afișează ca output numărul de vizualizări ale portalului din fiecare zi:
LoginController.java care va trimite informațiile necesare afișării paginii `Dashboard` (în urma unui request de tipul GET):
Pagina `Dashboard`: dashboard.jsp
Clasa StatisticsController.java implementată pentru a oferi datele necesare afișării graficelor din modulul de administrare
Fisierul JavaScript creat pentru a prelua datele din controller și apoi, pentru a le afișa în pagina `Statistici`:
Pagina `Statistici` – `morris.jsp`
Bibliografie
Documentație Bootstrap https://en.wikipedia.org/wiki/Bootstrap_(front-end_framework) – Accesat: 2015
Documentație Selenium https://en.wikipedia.org/wiki/Selenium_(software) – Accesat: 2015
Documentație JMeter https://en.wikipedia.org/wiki/Apache_JMeter – Accesat: 2015
Documentație Java https://en.wikipedia.org/wiki/Java_(programming_language) – Accesat: 2015
Documentație Hibernate https://en.wikipedia.org/wiki/Hibernate_(Java) – Accesat: 2015
Documentație Spring Framework https://en.wikipedia.org/wiki/Spring_Framework – Accesat: 2015
Documentație Java Server Pages https://en.wikipedia.org/wiki/JavaServer_Pages – Accesat: 2015
Mark Kerzner, Sujee Maniyam – Hadoop Illuminated
Viktor Mayer-Schonberger , Kenneth Cukier – Big Data. A revolution that will transform how we live, work and think
Documentație Hadoop https://en.wikipedia.org/wiki/Apache_Hadoop – Accesat: 2015
Documentație Hadoop https://hadoop.apache.org/ – Accesat: 2015
Documentație Big Data https://en.wikipedia.org/wiki/Big_data – Accesat: 2015
Christoff Strauch – NoSQL Databases
Documentație MapReduce https://en.wikipedia.org/wiki/MapReduce – Accesat: 2015
Documentație Linux https://en.wikipedia.org/?title=Linux – Accesat: 2015
Documentație Ubuntu https://en.wikipedia.org/?title=Ubuntu_(operating_system) – Accesat: 2015
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Portal de Stiri, Platforma Hadoop (ID: 150133)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
