Download - Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

Transcript
Page 1: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

Universitatea “Politehnica” din Bucureşti Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei

Implementarea tehnologiilor NoSQL şi REST în dezvoltarea aplicaţiilor care gestionează un volum mare de date

Proiect de diplomă

prezentat ca cerinţă parţială pentru obţinerea titlului de Inginer în domeniul Calculatoare şi Tehnologia Informaţiei

programul de studii de licenţă Ingineria Informaţiei

Conducător lucrare Student Şl.Dr.Ing. Valentin PUPEZESCU Marian Gabriel Popa

Page 2: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită
Page 3: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită
Page 4: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită
Page 5: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

5

Cuprins Lista figurilor . . . . . . . . . . 7 Lista acronimelor . . . . . . . . . 9 Capitolul 1 : Introducere . . . . . . . . 11 1.1 Obiectivele lucrării . . . . . . . 11 1.2 Baze de date distribuite . . . . . . . 11 1.3 Servicii web . . . . . . . . 12 Capitolul 2: Tehnologii implementate . . . . . . 15 2.1 Baza de date Cassandra . . . . . . . 15 2.1.1 Structura internă a bazei de date Cassandra. . . . 15 2.1.1.1 Cluster . . . . . . . 15 2.1.1.2 Keyspace . . . . . . 17 2.1.1.3 Familie de coloane . . . . . 17 2.1.1.4 Coloană . . . . . . 17 2.1.1.5 Supercoloană . . . . . . 18 2.1.2 Cassandra Query Language (CQL) . . . . 18 2.1.3 Clienți Cassandra . . . . . . 19 2.2 Tehnologia REST (Representational State Transfer) . . . 19 2.2.1 Caracteristici principale ale serviciilor web bazate pe REST . 19 2.2.2 Dropwizard . . . . . . . 21 2.2.2.1 Jersey . . . . . . . 21 2.2.2.2 JSON . . . . . . . 21 2.3 Java Gui/Swing . . . . . . . . 22 2.4 Maven . . . . . . . . . 22 Capitolul 3: Proiectarea aplicației . . . . . . . 23 3.1 Datacenter . . . . . . . . . 24 3.2 Serviciul Web/Server Web . . . . . . 26 3.3 Serverul de baze de date Cassandra . . . . . 28 Capitolul 4 : Implementarea si rularea aplicației . . . . . 29 4.1 Proiectarea și rularea serverului de baze de date Cassandra . . 29 4.2 Rularea simulatorului pentru Datacenter și a Serviciului web . . 33 Concluzii . . . . . . . . . . 37 Bibliografie . . . . . . . . . . 39 Anexă . . . . . . . . . . . 41

Page 6: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

6

Page 7: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

7

Lista figurilor Fig 2.1 Cluster Cassandra . . . . . . . . 16 Fig 2.2 Exemplu Factor de replicare . . . . . . . 16 Fig 2.3 Familie de coloane . . . . . . . . 17 Fig 2.4 Structura unei coloane . . . . . . . 17 Fig 2.5 Structura unei supercoloane . . . . . . . 18 Fig 2.6 Utilizarea unei strategii pentru replicarea datelor . . . . . 18 Fig 2.7 Crearea unei cereri de tip GET . . . . . . 20 Fig 2.8 Maparea resurselor Url . . . . . . . 21 Fig 3.1 Schema generală a aplicaţiei . . . . . . . 23 Fig 4.1 Configurarea fişierului cassandra.în.sh . . . . . 31 Fig 4.2 Accesarea fișierului de configurare cassandra.yaml . . . . 31 Fig 4.3 Configurarea fișierului cassandra.yaml . . . . . 32 Fig 4.4 Setarea ip-urilor din lista de seed . . . . . . 33 Fig 4.5 Setarea porturilor . . . . . . . . 33 Fig 4.6 Setarea ip-urilor locale pentru nodurile virtuale . . . . 33 Fig 4.7 Pornirea serverului de baze de date . . . . . . 34 Fig 4.8 Rezultatul pornirii celorlate 2 noduri . . . . . . 34 Fig 4.9 Afișarea nodurilor din inel . . . . . . . 35 Fig 4.10 Pornirea Serverului web . . . . . . . 36 Fig 4.11 Interfaţă grafică a simulatorului pentru Datacenter . . . . 36 Fig 4.12 Datele trimise de la Datacenter către serviciul web . . . . 37 Fig 4.13 Consola CLI a bazei de date Cassandra . . . . . 37 Fig 4.14 Expirarea ttl-ului coloanelor . . . . . . . 38

Page 8: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

8

Page 9: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

9

Lista acronimelor REST - Representational state transfer HTTP - Hypertext Transfer Protocol SOAP - Simple Object Access Protocol CQL - Cassandra query language SQL - Structured Query Language XML - eXtensible Markup Language JSON - JavaScript Object Notation GUY - Graphic User Interface

Page 10: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

10

Page 11: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

11

Cap1. Introducere 1.1 Obiectivele lucrării Lucrarea are ca scop prezentarea avantajelor folosirii bazelor de date NoSQL (baza de date Cassandra) pentru gestionarea unui volum foarte mare de date (DataCenter) prin intermediul unui serviciu web construit cu REST (Representational state transfer). Aplicaţia va fi alcătuită din 3 părţi (Simulator pentru DataCentr, Serviciul Web şi Serverul de date Cassandra). Se va testa comportamentul baze de date prin scrierea şi citirea unui volum mare de date . Am ales să dezvolt o aplicaţie care are la baza un sistem de baze de date distribuit deoarece este un domeniu din ce în ce mai popular, care vine cu soluţii la problemele legate de stocarea şi citirea cantităţilor mari de date, posibilitatea creării unui sistem distribuit folosind noduri virtuale şi replicarea datelor pe aceste noduri. Un alt obiectiv este acela de a aprofunda cunoştinţele de Java şi de a lucra pe partea de backend a aplicaţiei şi anume crearea serverului web a simulatorului de date şi clientul pentru baza de date. 1.2 Baze de date distribuite O baza de date distribuită se poate descrie ca o reţea de servere de baze de date locale/remote care comunica între ele şi formează o baza de date. Datele sunt distribuite uniform, se pot adăuga şi citi date de pe orice nod al "reţelei" deoarece clientul o vede ca pe o singură entitate.

Fig 1.2 Schema unei baze de date distribuite

Sursa [1] Pentru dezvoltarea aplicaţiei am ales baza de date Cassandra deoarece se poate insera un volum foarte mare de date fără a compromite performanţa. Voi vorbi în detaliu despre baza de date Cassandra în capitolul Tehnologii implementate.

Page 12: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

12

1.3 Servicii Web Un serviciu web este este o componentă software care expusă în internet sau în reţeaua locală poate comunica cu alte componente. Un serviciu web face posibilă comunicarea între componente software scrise în limbaje de programare diferite. Acestea furnizează informaţii în format XML, Json , etc.. pe care fiecare limbaj de programare ştie să le interpreteze în modul propriu. Componentele de baza sunt XML şi HTTP. Modul de funcţionare: Clientul face o cerere HTTP POST/GET , informaţiile trimise de el sunt împachetate într-un mesaj SOAP , acest mesaj reprezintă corpul cereri HTTP, serviciul web trimite mesajul la destinaţie unde este interpretat de altă componentă şi se returnează un răspuns în acelaşi mod.

Fig1.2 Procesul unui serviciu web

Sursa: [2] Aplicaţia foloseşte arhitectura REST (REpresentational State Transfer) pentru a construi serviciul web, această arhitectură rulează peste protocolul HTTP. REST este mult mai simplu de folosit decât componentă SOAP (Simple Object Access Protocol) descrisă mai sus deoarece nu necesită un program pe partea de server care să ofere date sau un program pe partea de client care să ceară datele, acesta foloseşte protocolul HTTP pentru a face apelurile între maşini. Aplicaţiile REST folosesc acest protocol pentru a trimite date, a citi sau a şterge,

Page 13: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

13

prin metodele GET, POST, PUT sau DELETE. Mai multe detalii în capitolul Tehnologii implementate.

Fig 1.3 Structura unui serviciu web care foloseste REST

Sursa [3]

Page 14: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

14

Page 15: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

15

Cap2. Tehnologii implementate 2.1 Baza de date Cassandra Cassandra este o bază de date distribuită, apărută în anul 2008, este un proiect open source scris în limbajul de programare java care permite manevrarea unei cantităţi foarte mari de informaţie şi împărţirea acesteia pe mai multe servere. Cassandra implementează un sistem de comunicare peer-to-peer pentru a asigura comunicarea între nodurile din cluster. Cassandra este o baza de date orientată pe rânduri, care permite oricărui utilizator autorizat să se conecteze la orice nod folosind limbajul CQL (Cassandra query language). CQL este un limbaj similar SQL prin care utilizatorul poate comunica cu baza de date. Cererile de scriere respectiv citire pot merge către orice nod din cluster, când un client face o cerere către un nod, acel nod devine nod coordonator între client şi celelalte noduri, aşa cum am spus şi în introducere, datorită faptului că se foloseşte o baza de date distribuită, clientul vede clusterul ca pe o singură baza de date. 2.1.1 Structura internă a bazei de date Cassandra Baza de date Cassandra este structurată după următorul model : 1. Clusteri 2. Keyspace 3. Column families (Familie de coloane) 4. Columns (Coloane) 5. Super columns. (Super coloane) 2.1.1.1 Cluster Un cluster este un inel de noduri. Clientul se conectează la aceste noduri ( nod coordonator), şi face cereri de citire/scriere/ştergere. Toate nodurile au un token care precizează ce procent din informaţia scrisă să fie stocată pe acel nod.

Page 16: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

16

Fig 2.1 Cluster Cassandra

Sursa [4]

De asemenea nodurile permit şi un factor de replicare, acest factor de replicare reprezintă pe câte noduri este scris rândul,se creează astfel un backup pentru rândul respectiv. Strategia de replicare determină ce nod stochează replică unui rând . Cassandra beneficiează de mecanisme care permit replicarea automată fără efort din partea programatorului. Faptul că datele sunt replicate pe mai multe noduri oferă o siguranţă mai mare a datelor şi un grad ridicat de accesibilitate. Datorită acestui lucru se pot adaugă/şterge noduri fără probleme şi fără riscul de a pierde datele sau a fi nevoiţi să oprim serverul de baze de date.

Fig 2.2 Exemplu Factor de replicare

Sursa [4]

Page 17: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

17

2.1.1.2 Keyspace Keyspace-ul este un container unde sunt ţinute datele în cassandra asemeni unei tabele într-o baza de date relaţională. Principalele atribute ale unui keyspace sunt : - Factorul de replicare - Strategia de replicare - Familii de coloane 2.1.1.3 Familie de coloane O familie de coloane este un container pentru o colecţie de rânduri, unde fiecare rând conţine o colecţie ordonată de coloane.

Fig 2.3 Familie de coloane

Sursa [5] 2.1.1.4 Coloana Este unitatea cea mai simplă în modelul de date şi conţine un nume, o valoare şi un ceas (timestamp).

Fig 2.4 Structura unei coloane

Sursa [5]

Page 18: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

18

2.1.1.5 Supercoloana O super coloana este o harta (map) care conţine subcoloane, mai multe coloane grupate sub un singur nume. Nu putem avea decât un singur nivel de adâncime, o supercoloana nu poate conţine supercoloane care la rândul lor să conţină coloane.

Fig 2.5 Structura unei supercoloane

Sursa [5]

2.1.2 Cassandra Query Language (CQL) Cassandra Query Language (CQL) este un limbaj asemănător cu cel SQL (Structured Query Language) pentru interogarea bazei de date. CQL are câteva diferenţe majore faţă de SQL , una dintre acestea este că nu există operaţiunea de JOIN între două tabele. Exemplu sintaxa: CREATE KEYSPACE test WITH strategy_class = 'SimpleStrategy'; * codul de mai sus creează un keyspace (spaţiu de lucru) cu numele test şi cu strategia de replicare 'SimpleStrategy'.

Fig 2.6 Utilizarea unei strategii pentru replicarea datelor

Sursa [5] Figura 2.6 ne arată cum datele sunt replicate de la nodul 1 din Rack-ul 1 în cele două noduri din Rack-ul 2. Acest lucru se face specificând strategia de replicare atunci când creăm keyspace-ul

Page 19: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

19

2.1.3 Clienţi Cassandra Pentru a face conectarea la baza de date folosind limbajul java avem nevoie de un client. Cassandra dispune de mai mulţi clienţi care pun la dispoziţie un API (Application Programming Interface) prin intermediul căruia programatorul se conectează/lucrează cu baza de date. Doi dintre aceştia sunt Thrift şi Hector. În aplicaţie am folosit clientul Hector, acesta este un client de nivel înalt bazat pe tehnologia java, care aduce îmbunătăţiri faţă de clientul Thrift, acestea fiind logging-ul, connection pooling ,implementarea sintaxei CQL dar şi metode mai simple şi uşor de folosit. Un exemplu simplu de folosire al clientului Hector : Cluster cluster = HFactory.getOrCreateCluster("TestCluster", new CassandraHostConfigurator("localhost:9160")); Keyspace keyspace = HFactory.createKeyspace("Keyspace1", cluster); Exemplul de mai sus creează un cluster şi un keyspace folosind clasa HFactory . 2.2 Tehnologia REST (Representational State Transfer) REST se poate descrie ca un set de principii prin care se poate proiecta un serviciu web care se axează pe resursele sistemului. REST defineşte un design destul de simplu pentru a modifica, crea sau şterge resurse , practic el foloseşte metodele HTTP în mod explicit urmând protocoalele aşa cum au fost definite. 2.2.1 Caracteristici principale ale serviciilor web bazate pe REST : Client-Server Este un stil bazat pe cereri, Clientul face o cerere catre server prin una din metodele (HTTP GET, POST, PUT, DELETE) iar Serverul ii raspunde Stateless Fiecare cerere de la client către server trebuie să conţină informaţiile necesare pentru ca cererea să poată fi înţeleasă, nu trebuie să profite de conţinutul serverului. Singurul dezavantaj este încărcarea reţelei prin trimiterea repetată a datelor.

Page 20: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

20

Exemplu:

Fig 2.7 Crearea unei cereri de tip GET

[6] În exemplul de mai sus clientul face o cerere de tip GET prin intermediul url-ului iar serviciul web îi întoarce răspunsul. Interfaţa uniformă Toate resursele sunt accesate printr-o interfaţă generică (HTTP GET, POST, PUT, DELETE) , aceasta este o caracteristică importantă în arhitectura REST deoarece foloseşte în mod explicit metodele HTTP prin faptul că urmează protocoalele definite de acestea. De exemplu metoda HTTP GET este folosită de client pentru a prelua resurse , pentru a extrage date de pe un server web sau pentru a executa o interogare pe un server web . Componente aşezate pe straturi Servere proxy, servere cache - inserate între client şi resurse pentru o performanţă şi securitate mai bună.

Page 21: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

21

Maparea resurselor url O altă caracteristică importantă este maparea resurselor url, aceasta precizează că fiecărei resurse să-i corespundă un url unic .

Fig 2.8 Maparea resurselor Url

Sursa [7] 2.2.2 Dropwizard Dropwizard este un framework bazat pe arhitectura REST cu care am dezvoltat serviciul web. Acesta pune la dispoziţie tool-uri pentru crearea serviciilor web REST folosind Jersey şi formatarea datelor folosind JSON . 2.2.2.1 Jersey Jersey este un tool pentru dezvoltarea serviciilor web REST folosind limbajul de programare Java. Jersey conţine propriul API pentru folosirea serviciului REST . 2.2.2.2 JSON JSON (JavaScript Object Notation) este un mod de formatare al datelor , uşor de folosit şi uşor de parsat şi generat de către maşini. Este un format text complet independent de limbajul de programare care foloseşte convenţii ce sunt familiare programatorilor. Structura formatului JSON: - O colecţie de perechi nume/valoare. - O lista ordonată de valori 2.3 Java GUI/Swing Tehnologia Java Swing pune la dispoziţie o suită de componente pentru realizarea unei interfeţe grafice GUI (Graphic User Interface) . Face parte din JFC (Java Fundation Packages) şi include mai multe pachete pentru dezvoltarea aplicaţiilor desktop în Java. Aplicaţiile Swing sunt scrise în totalitate în Java aşadar independente de platforma.

Page 22: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

22

Swing implementează pattern-ul de dezvoltare MVC(Model view controller) separând modelul interfeţei de modelul aplicaţiei. Pe scurt pattern-ul MVC(Model view controller) reprezint un mod de a construi o aplicaţie, urmând un set de regului. Rezultatul este o aplicaţie al cărui cod este uşor de citit, uşor de parcurs şi este structurat mult mai bine. 2.4 Maven Maven este un tool dezvoltat de Apache pentru managementul proiectelor Java. Este un tool foarte puternic si bine structurat, foloseste un fisier xml pentru a descrie cum este proiectul construit si anume dependintele fata de alte module externe si componente, ordinea in care au fost construite si plugin-urile necesare. Maven downloadeaza in mod dinamic librariile java din repository-urile predefinite sau repository-ul central Maven 2 Central Repository si le stocheaza intr-o locatie temporara. Exemplu de creare a unei dependinte: <dependency> <groupId>me.prettyprint</groupId> <artifactId>hector-core</artifactId> <version>1.0-5-SNAPSHOT</version> </dependency> Secvenţa de cod de mai sus declara o dependinta în fişierul pom.xml al proiectului , această dependinţă îi spune compilatorului că are nevoie de librăria json, această librărie se descarcă automat dacă este declarată în fiserul pom.xml. Acest tip de management al proiectului, în care declarăm dependinţe ajută foarte mult în dezvoltarea aplicaţiei deoarece nu trebuiesc descărcate manual toate librăriile de care avem nevoie.

Page 23: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

23

Cap3. Proiectarea aplicaţiei Aşa cum am menţionat în capitolul 1, aplicaţia este formată din 3 părţi şi are ca scop generarea metricilor care vin de la datacenter, trimiterea acestora către serverul web prin intermediul serviciului web , care acesta mai departe le trimite către baza de date Cassandra. Apoi peste aceste date se aplică un algoritm de map reduce. (Fig 3.1) Map reduce se referă la faptul că datele sunt mediate şi trecute într-o altă "tabela" (keyspace), pentru a putea ţine datele cât mai eficient şi pentru a ocupa cât mai puţină memorie. 1. Datacenter 2. Serviciu Web / Server Web 3 Server baze de date Cassandra

Fig 3.1 Schema generală a aplicaţiei

Page 24: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

24

3.1 Datacenter Datacenter-ul constă într-un generator de metrici care generează random încărcarea memoriei, a procesorului dar şi ip-ul calculatorului de unde provin metricilie. Exemplu generator de ip-uri: public String ipGenerator(int nr_servers){ int frst_octet=valuesGenerator(223, 223); int scnd_octet=valuesGenerator(16, 16); int thrd_octet=valuesGenerator(192, 192); int frth_octet=valuesGenerator(1, nr_servers); return parseInt(frst_octet)+"."+parseInt(scnd_octet)+"."+parseInt(thrd_octet)+"."+parseInt(frth_octet)+" "; } public double valuesGenerator(double min, double max) { return (Math.random() * (max - min + 1)) + min; } Acest cod generează pentru fiecare server un ip, octeţii sunt generaţi folosind metodă valuesGenerator această metodă generează un număr random între cele două argumente date ca parametru. Exemplu interfaţă grafică configurare şi pornire server metrici : ConfigFrame server1ConfigFrame=new ConfigFrame("192.168.1.1","90",String.valueOf(time),"60"); private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) { server1ConfigFrame.setDefaultRunTime("60"); server1ConfigFrame.setDefaultServerIp("192.168.1.1"); server1ConfigFrame.setDefaultTimestamp(String.valueOf(time)); server1ConfigFrame.setDefaultTTL("90"); server1ConfigFrame.setVisible(true); } Acesta secvenţă porneşte la apăsarea pe buton fereastra de configurare a primului server . private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { System.out.println("Server1 config:"); System.out.println(server1ConfigFrame.getServerIp()); System.out.println(server1ConfigFrame.getRunTime()); System.out.println(server1ConfigFrame.getTTL()); System.out.println(server1ConfigFrame.getTimestamp()); System.out.println("Server1 Started"); Thread server1thread = new Thread(server1); server1thread.start();}

Page 25: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

25

La apăsarea butonului este afişată configuraţia serverului care rulează şi este pornit firul de execuţie pentru primul server. Exemplu: trimiterea metricilor către web service folosind Jersey- Json Client client = Client.create(); // crează un nou client Jersey WebResource webResource = client.resource("http://localhost:8080/cassandratest/cpuline"); // precizează unde este resursa disponibilă (url-ul) MetricsGenerator datagenerator = new MetricsGenerator(); //creează o nouă instanţa a clasei MetricGenerator pentru generarea valorilor random String cpuLoad = datagenerator.getMetricValue(20.0, 70.0); String memLoad = datagenerator.getMetricValue(500.0, 2500.0); String serverip = new String(serverIP); int Ttl = Integer.parseInt(TTL); // Setează ttl-ul (time to live), este o opţiune care îi spune bazei de date că după un anumit timp setat de utilizator, rândul să se şteargă automat. String serverIp = new String("\"" + serverip + "\""); String metricName = new String("\"" + datagenerator.getMetricName("cpu-load") + "\""); String keyspace = new String("\"" + keyspace_name + "\""); String columnfamily = new String("\"" + columnfamily_name+ "\""); String timestamp = String.valueOf(time); String ttl = String.valueOf(Ttl); String input = "{\"timestamp\":" + timestamp + ", \"memLoad\": " + memLoad + ", \"cpuLoad\": "+ cpuLoad + ", \"serverIp\": " + serverIp + ", \"metricName\":" + metricName + ", \"ttl\":" + ttl + ", \"keyspace_name\":" + keyspace + ", \"columnfamily_name\":" + columnfamily + " }"; // Acesta este input-ul pe care îl trimitem serviciului web: un string în format JSON ClientResponse response = webResource.type("application/json") .post(ClientResponse.class, input); //trimitem input-ul sub forma unei metode HTTP POST if (response.getStatus() != 201) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());} // Se verifică dacă serverul este online, dacă statusul este 201 atunci datele au fost trimise cu succes.

Page 26: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

26

3.2 Serviciul Web / Server Web Serviciul web a fost creat folosind framework-ul Dropwizard, acesta pune la dispoziţie o serie de tool-uri pentru construirea şi integrarea serviciilor web în aplicaţii java. Pentru început voi descrie modul în care se configurează/intializeaza un server web creat cu Dropwizard. package serverSide.dropwizard.WebService; import com.yammer.dropwizard.Service; import com.yammer.dropwizard.config.Environment; // Se importă pachetele necesare public class WebService extends Service<WebServiceConfiguration> { // Se declară clasa WebService care extinde clasa Service pentru crearea serviciului web public static void main(String[] args) throws Exception { new WebService().run(args); } private WebService() { super("Web-Service"); } @Override protected void initialize(WebServiceConfiguration configuration, Environment environment) { final String template = configuration.getTemplate(); final String defaultName = configuration.getDefaultName(); environment.addResource(new WebServiceResource(template, defaultName)); } // Se iniţializează serviciul web şi se adaugă resursa default descrisă în fişierul de configurare. } Configurarea resurselor pentru serviciul web: @Path("/cassandratest") @Produces(MediaType.APPLICATION_JSON) public class WebServiceResource { private final String template; private final String defaultName; private final AtomicLong counter; public WebServiceResource(String template, String defaultName) { this.template = template; this.defaultName = defaultName; this.counter = new AtomicLong();

Page 27: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

27

} În primă fază setăm calea absolută a aplicaţiei adnotările (@Path, @Produces) precizează această calea , şi tipul de date acceptat (JSON). @POST @Path("/cpuline/") @Consumes(MediaType.APPLICATION_JSON) public Response addMetricLine(MetricsDao metricLine){ MetricsDataProcesor serverDataGenerator = new MetricsDataProcesor(); serverDataGenerator.insertMetricLine(metricLine); System.out.println(metricLine); return Response.status(Status.CREATED).build(); } Secvenţa de cod de mai sus precizează calea unde resursa este disponibilă la adresa (http://localhost:8080:cassandratest/cpuline/) , consumă tipul de date JSON iar metoda HTTP este de tip POSTExemplu de trimitere a datelor : ClientResponse response = webResource.type("application/json") .post(ClientResponse.class, input); Din Datacenter se face o cerere de tip POST , datele ajung la servicul web unde se prelucrează, MetricsDao cpuLine acest parametru al metodei addMetricLine este de fapt cererea trimis de către Datacenter, este un string de tip Json pe care metoda addMetricLine îl foloseşte pentru a trimite datele către baza de date. Să analizăm metoda addMetricLine (metricLine) : public void insertMetricLine(MetricsDao metricLine){ cassandraHClient.setColumnfamily_name(metricLine.getColumnfamily_name()); // Seteaza numele familiei de coloane cassandraHClient.setKeyspace_name(metricLine.getKeyspace_name()); //Seteaza numele keyspace-ului cassandraHClient.getComposite_mutator().addInsertion( // apelează metoda addInsertion care face inserarea datelor în baza de date, datele sunt parametrii daţi funcţiei rowkey(metricLine,"cpu-load"), // rowkey este o metodă care crează o cheie formată din două componente : ip şi numele metricii cassandraHClient.getColumnfamily_name(), cassandraHClient.createHcolumn_ss(metricLine.getTimestamp(), metricLine.getCpuLoad(),metricLine.getTtl())); cassandraHClient.getComposite_mutator().execute(); // Inserează în baza de date cassandraHClient.getComposite_mutator().addInsertion(

Page 28: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

28

rowkey(metricLine,"mem-load"), cassandraHClient.getColumnfamily_name(), cassandraHClient.createHcolumn_ss( metricLine.getTimestamp(),metricLine.getMemLoad(),metricLine.getTtl())); cassandraHClient.getComposite_mutator().execute(); } Am menţionat mai sus că metricLine este un String în format Json care conţine toate informaţiile pe care dorim să le introducem în baza de date . După cum se observă metricLine este de tipul MetricsDao care face automat conversia de la tipul de date String primit de la DataCenter la tipul clasei. MetricsDao este un model al obiectului pe care vrem să-l inserăm în baza de date. Dacă vroiam să nu mai creeam această clasa puteam să folosim librăria Json care conţine metode de prelucrare automată a datelor dintr-un String în format Json. 3.3 Serverul de baze de date Cassandra Pentru proiectarea clusterului Cassandra am folosit mai multe servere Cassandra cărora le-am atribuit ip-uri locale, iar apoi din fişierul de configurare le-am conectat în acelaşi cluster. Voi dezvolta acest subiect în capitolul 4 Implementarea şi rularea aplicaţiei.

Page 29: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

29

Cap4. Implementarea şi rularea aplicaţiei 4.1 Proiectarea şi rularea serverului de baze de date Cassandra Configurarea fişierelor de configurare ale Serverului Cassandra

Fig 4.1 Configurarea fişierului cassandra.în.sh În acest fişier configurăm calea către directorul unde este instalat serverul Cassandra.

Fig 4.2 Accesarea fișierului de configurare cassandra.yaml

Page 30: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

30

Fig 4.3 Configurarea fișierului cassandra.yaml

În acest fişier configurăm numele Clusterului, ip-ul nodului , porturile pe care acceptă conexiuni şi token-ul .

Fig 4.4 Setarea ip-urilor din lista de seed

Aceşti parametri precizează modul în care nodurile sunt descoperite în cluster.

Page 31: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

31

Fig 4.5 Setarea porturilor

Fig 4.6 Setarea ip-urilor locale pentru nodurile virtuale

Datorită faptului că nu aveam la dispoziţie maşini fizice pe care să instalez serverul de baze de date apoi să creez un cluster cu aceste maşini am ales să creez alias-uri la adresa de loopback pentru fiecare nod virtual pe care vroiam să-l instalez.

Page 32: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

32

Fig 4.7 Pornirea serverului de baze de date

După pornirea unuia dintre noduri cu comanda ./cassandra -f acesta aşteaptă conexiuni din partea celoralte noduri.

Fig 4.8 Rezultatul pornirii celorlate 2 noduri

Page 33: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

33

Fig 4.9 Afișarea nodurilor din inel

După pornirea celorlalte noduri , putem afişa nodurile din ring cu comanda nodetool -h 127.0.0.1 -p 7199 ring, acesta comandă afişează ip-urile nodurilor, datacenter-ul din care fac parte, statusul, şi încărcarea fiecărui nod. 4.2 Rularea simulatorului pentru Datacenter și a Serverului web

Fig 4.10 Pornirea Serverului web

Page 34: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

34

Se poate observă în figura 4.10 calea de unde pot fi accesate resursele serverului web.

Fig 4.11 Interfaţă grafică a simulatorului pentru Datacenter

Din interfaţa grafică se poate porni simulatorul pentru Datacenter, iniţial sunt 3 servere care trimit date simultan către Serviciul web, acestea rulând pe fire de execuţie separate. Se poate modifica folosind metoda descrisă mai sus public String ipGenerator(int nr_servers ) {//code here} pentru a pune un număr mult mai mare de servere. Atunci interfaţa se va modifica.

Fig 4.12 Datele trimise de la Datacenter către serviciul web

În imaginea de mai sus avem consola serverului web care a primit metricile de la utilizator şi care le trimite către Serverul de baze de date Cassandra

Page 35: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

35

Fig 4.13 Consola CLI a bazei de date Cassandra

În figura 4.13 accesăm consola CLI(Comand line interface) a serverului de baze de date , accesăm keyspace-ul creat cu comanda use test_database; apoi listăm conţinutul cu comandta list test; test fiind numele coloanei. Sunt returnate 2 rânduri pentru Serverul 1 iar fiecare rând conţine un anumit număr de coloane setat în configuraţia de rulare a Serverului de metrici .

Fig 4.14 Expirarea ttl-ului coloanelor

Figura 4.14 ne arată rezultatul exipirarii ttl-ului setat în configurația datacenter-ului.

Page 36: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

36

Având serviciul web creat şi simulatorul pentru datacenter, aplicaţia se poate extinde aplicând algoritmi de reducere a datelor (Map reduce) şi creeand alte spaţii de lucru unde datele mediate pot fi ţinute.

Page 37: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

37

Concluzii Baza de date Cassandra este un tool foarte puternic pentru manevrarea cantităţilor mari de informaţii datorită faptului că scrierile se fac foarte rapid iar structura internă permite crearea de noduri în cluster cu diferite grade de replicare. Analizând un cluster Cassandra putem spune că gradul de scalabilitate este foarte ridicat, putând introduce şi şterge noduri fără ca datele sau performanţa să fie afectate. Datorită clienţilor scrişi cu limbajul Java conectarea şi lucrul cu baza de date se fac foarte uşor. Pentru Serviciul web arhitectură REST reuşeşte să aducă simplitate în proiectarea serviciului şi sa limiteaze modul în care o resursă poate fi accesată/utilizată. În concluzie implementarea bazei de date Cassandra pentru un design care presupune lucrul cu o bază de date distribuită şi un volum mare de date este alegerea cea mai potrivită.

Page 38: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

38

Page 39: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

39

Bibliografie Surse capitole: 1.2 Distributed Database Concepts http://docs.oracle.com/cd/B10501_01/server.920/a96521/ds_concepts.htm 1.3 WebServices http://www.tutorialspoint.com/webservices/what_are_web_services.htm 1.3 REST http://searchsoa.techtarget.com/definition/REST 2.1 Introduction to Cassandra Clusters http://www.planetcassandra.org/blog/post/introduction-to-cassandra-clusters 2.1 Cassandra Architecture http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architectureIntro_c.html 2.1.2 Cassandra Report http://share.pdfonline.com/c5fcaa7111f542c7877b929f8898516c/Seminar%20Report-Cassandra.pdf 2.1.3 Cassandra Query Language http://www.slideshare.net/shotaz/cql-cassandra-query-language 2.2 RestFull web Services http://www.ibm.com/developerworks/webservices/library/ws-restful/ 2.2 Rest Architecture http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm 2.2.1 RestFull web Services http://www.ibm.com/developerworks/webservices/library/ws-restful/ 2.2.3 Dropwizard http://dropwizard.codahale.com/getting-started/ 2.2.3.1 Jersey http://jersey.java.net/ 2.2.3.2 Json http://www.json.org/ 2.3 Bruce Eckel - Thinking in Java, 4thEdition 2.3 Java Swing http://java.dzone.com/articles/javaswing-2013-it-worth-it 2.4 Maven http://maven.apache.org/ 2.4 Apache Maven http://en.wikipedia.org/wiki/Apache_Maven Surse imagini : [1] Database Concepts

Page 40: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

40

http://docs.oracle.com/cd/B10501_01/server.920/a96521/ds_concepts.htm [2] Web services http://catmousavi.wordpress.com/2011/11/10/what-is-web-services-according-to-w3c-big-web-services-vs-restful-services/ [3] Introduction to Apache http://wink.apache.org/documentation/1.0/html/1%20Introduction%20to%20Apache%20Wink.html [4] Introduction to Cassandra Clusters http://www.planetcassandra.org/blog/post/introduction-to-cassandra-clusters [5] Cassandra Report http://share.pdfonline.com/c5fcaa7111f542c7877b929f8898516c/Seminar%20Report-Cassandra.pdf [6] RestFull web Services http://www.ibm.com/developerworks/webservices/library/ws-restful/ [7] Rest Architecture simplified http://blog.architexa.com/2010/11/rest-architecture-simplified/

Page 41: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

41

Anexă Structura pachetelor in proiect

Voi atașa anexei cateva dintre aceste clase.

Page 42: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

42

package clientServer; public class CassandraClientDao { String keyspace_name; String columnfamily_name; public String getKeyspace_name() { return keyspace_name; } public void setKeyspace_name(String keyspace_name) { this.keyspace_name = keyspace_name; } public String getColumnfamily_name() { return columnfamily_name; } public void setColumnfamily_name(String columnfamily_name) { this.columnfamily_name = columnfamily_name; } @Override public String toString() { return "CassandraClientConfig [keyspace_name=" + keyspace_name + ", columnfamily_name=" + columnfamily_name + "]"; } } package clientServer; public class MetricsDao { long timestamp; String serverIp; String metricValue; String metricName; int ttl; String cpuLoad; String memLoad; String runTime; String keyspace_name; String columnfamily_name; public String getKeyspace_name() { return keyspace_name; } public void setKeyspace_name(String keyspace_name) { this.keyspace_name = keyspace_name; } public String getColumnfamily_name() { return columnfamily_name; } public void setColumnfamily_name(String columnfamily_name) {

Page 43: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

43

this.columnfamily_name = columnfamily_name; } public String getRunTime() { return runTime; } public void setRunTime(String runTime) { this.runTime = runTime; } public String getCpuLoad() { return cpuLoad; } public void setCpuLoad(String cpuLoad) { this.cpuLoad = cpuLoad; } public String getMemLoad() { return memLoad; } public void setMemLoad(String memLoad) { this.memLoad = memLoad; } public int getTtl() { return ttl; } public void setTtl(int ttl) { this.ttl = ttl; } public String getServerIp() { return serverIp; } public void setServerIp(String serverIp) { this.serverIp = serverIp; } public String getMetricName() { return metricName; } public void setMetricName(String metricName) { this.metricName = metricName; } public String getMetricValue() { return metricValue; } public void setMetricValue(String metricValue) { this.metricValue = metricValue; }

Page 44: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

44

public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } @Override public String toString() { new String(); return "Line inserted: timestamp=" + timestamp + "ServerIp=" + serverIp + "ttl=" + String.valueOf(ttl) + "mem-load=" + memLoad + "cpu-load=" + cpuLoad + "keyspace_name=" + keyspace_name + "columnfamily_name=" + columnfamily_name + "]"; } } package clientSide.dropwizard.client; import clientSide.metrics_generator.metricGenerator.MetricsGenerator; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; public class DropwizardDataCenterMetrics { ThreadGroup grup = new ThreadGroup(""); public void insertLine(String TTL, String Timestamp, String serverIP, String runTime, String keyspace_name, String columnfamily_name) { long delay = 60; new String(); int runingTime = Integer.parseInt(runTime) * 2; long time = Long.parseLong(Timestamp); for (int i = 0; i < runingTime; i++) { try { MetricsGenerator datagenerator = new MetricsGenerator(); Client client = Client.create(); WebResource webResource = client .resource("http://localhost:8080/cassandratest/cpuline"); String cpuLoad = datagenerator.getMetricValue(20.0, 70.0); String memLoad = datagenerator.getMetricValue(500.0, 2500.0);

Page 45: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

45

String serverip = new String(serverIP); int Ttl = Integer.parseInt(TTL); String serverIp = new String("\"" + serverip + "\""); String metricName = new String("\"" + datagenerator.getMetricName("cpu-load") + "\""); String keyspace = new String("\"" + keyspace_name + "\""); String columnfamily = new String("\"" + columnfamily_name + "\""); new String(); String timestamp = String.valueOf(time); String ttl = String.valueOf(Ttl); String input = "{\"timestamp\":" + timestamp + ", \"memLoad\": " + memLoad + ", \"cpuLoad\": " + cpuLoad + ", \"serverIp\": " + serverIp + ", \"metricName\":" + metricName + ", \"ttl\":" + ttl + ", \"keyspace_name\":" + keyspace + ", \"columnfamily_name\":" + columnfamily + " }"; ClientResponse response = webResource.type("application/json") .post(ClientResponse.class, input); if (response.getStatus() != 201) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } i++; time = time + delay; // wait(100); } catch (Exception e) { e.printStackTrace(); } } // wait(5000); // insertLine(TTL, Timestamp, serverIP, runTime, keyspace_name, // columnfamily_name); } public static void wait(int n) { long t0, t1; t0 = System.currentTimeMillis(); do { t1 = System.currentTimeMillis();

Page 46: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

46

} while (t1 - t0 < n); } } package clientSide.metrics_generator.metricGenerator; import java.util.Random; import me.prettyprint.cassandra.serializers.DoubleSerializer; import me.prettyprint.cassandra.serializers.LongSerializer; public class MetricsGenerator { static final Random generator = new Random(); public static LongSerializer longSerializer = LongSerializer.get(); public static DoubleSerializer doubleSerializer = DoubleSerializer.get(); private double min, max; public String getServerip(int server_number) { int frst_octet = valuesGenerator(223, 223); int scnd_octet = valuesGenerator(16, 16); int thrd_octet = valuesGenerator(192, 192); int frth_octet = server_number; return parseInt(frst_octet) + "." + parseInt(scnd_octet) + "." + parseInt(thrd_octet) + "." + parseInt(frth_octet); } public String getMetricName(String metricName) { return metricName; } public String getMetricValue(double min, double max) { new String(); return String.valueOf((Math.random() * (max - min + 1)) + min); } public String setMetricName(String metric_name) { return metric_name; } public String parseInt(int n) { new String(); return String.valueOf(n); } public long getTime() { long time = System.currentTimeMillis(); return time; }

Page 47: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

47

public double valuesGenerator(double min, double max) { return (Math.random() * (max - min + 1)) + min; } public int valuesGenerator(int min, int max) { return (int) (Math.random() * (max - min + 1)) + min; } public int valuesIpGenerator(int nr_servers) { int i = 1; do { i++; return i; } while (i != nr_servers); } public double getMin() { return min; } public void setMin(double min) { this.min = min; } public double getMax() { return max; } public void setMax(double max) { this.max = max; } } package serverSide.cassandraDatabase.Hclient; import java.util.Arrays; import me.prettyprint.cassandra.model.BasicColumnFamilyDefinition; import me.prettyprint.cassandra.model.thrift.ThriftCountQuery; import me.prettyprint.cassandra.serializers.CompositeSerializer; import me.prettyprint.cassandra.serializers.DoubleSerializer; import me.prettyprint.cassandra.serializers.LongSerializer; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.cassandra.service.ThriftCfDef; import me.prettyprint.hector.api.Cluster; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.beans.Composite; import me.prettyprint.hector.api.beans.HColumn; import me.prettyprint.hector.api.beans.HCounterColumn;

Page 48: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

48

import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; import me.prettyprint.hector.api.ddl.ColumnType; import me.prettyprint.hector.api.ddl.ComparatorType; import me.prettyprint.hector.api.ddl.KeyspaceDefinition; import me.prettyprint.hector.api.exceptions.HInvalidRequestException; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.Mutator; public class CassandraHClient { public static StringSerializer stringSerializer = StringSerializer.get(); public static LongSerializer longSerializer = LongSerializer.get(); public static DoubleSerializer doubleSerializer = DoubleSerializer.get(); public static CompositeSerializer compositeSerializer = CompositeSerializer .get(); private Cluster cluster = HFactory.getOrCreateCluster("TestCluster", "127.0.0.3:5199"); private Keyspace keyspaceOperator = HFactory.createKeyspace( getKeyspace_name(), cluster); private Mutator<String> string_mutator = HFactory.createMutator( keyspaceOperator, StringSerializer.get()); private Mutator<Composite> composite_mutator = HFactory.createMutator( keyspaceOperator, compositeSerializer); public String keyspace_name; public String columnfamily_name; public CassandraHClient() { super(); } public HColumn<String, String> createHcolumn_ss(long timestamp, String metricValue, int ttl) { new String(); new String(); HColumn<String, String> factor = HFactory.createColumn( String.valueOf(timestamp), metricValue, ttl, StringSerializer.get(), StringSerializer.get()); return factor; } public void createColumnFamily() throws HInvalidRequestException { if (cluster.describeKeyspace(getKeyspace_name()) != null) { try { BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(); columnFamilyDefinition.setKeyspaceName(getKeyspace_name()); columnFamilyDefinition.setName(getColumnfamily_name()); columnFamilyDefinition .setComparatorType(ComparatorType.UTF8TYPE); columnFamilyDefinition.setColumnType(ColumnType.STANDARD);

Page 49: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

49

cluster.addColumnFamily(columnFamilyDefinition); } catch (HInvalidRequestException e) { setKeyspace_name(getKeyspace_name()); } } else { BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(); columnFamilyDefinition.setKeyspaceName(getKeyspace_name()); columnFamilyDefinition.setName(getColumnfamily_name()); ColumnFamilyDefinition cfDefStandard = new ThriftCfDef( columnFamilyDefinition); KeyspaceDefinition keyspaceDefinition = HFactory .createKeyspaceDefinition(getKeyspace_name(), "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDefStandard)); cluster.addKeyspace(keyspaceDefinition); setKeyspace_name(getKeyspace_name()); } } public String getColumnfamily_name() { return columnfamily_name; } public void setColumnfamily_name(String columnfamily_name) { CassandraHClient.this.columnfamily_name = columnfamily_name; } public Cluster getCluster() { return cluster; } public void setCluster(Cluster cluster) { this.cluster = cluster; } public Keyspace getKeyspaceOperator() { return keyspaceOperator; } public void setKeyspaceOperator(Keyspace keyspaceOperator) { this.keyspaceOperator = keyspaceOperator; } public Mutator<Composite> getComposite_mutator() { return composite_mutator; } public void setComposite_mutator(Mutator<Composite> composite_mutator) { this.composite_mutator = composite_mutator; } public Mutator<String> getString_mutator() { return string_mutator;

Page 50: Implementarea tehnologiilor NoSQL REST în dezvoltarea carestst.elia.pub.ro/PS/2013/PS2013toamna/441A_POPA_Marian-Gabriel.pdf · 1.2 Baze de date distribuite O baza de date distribuită

50

} public void setString_mutator(Mutator<String> string_mutator) { this.string_mutator = string_mutator; } public String getKeyspace_name() { return keyspace_name; } public void setKeyspace_name(String keyspace_name) { CassandraHClient.this.keyspace_name = keyspace_name; } }