NoSQL na prática! Cassandra em Java

775 visualizações

Publicada em

Apresentação da palestra sobre codificar em Java aplicações utilizando o banco de dados distribuídos Apache Cassandra, ministrada no 7º Encontro de usuários Java do Vale do Paraíba, o JUG-Vale.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
775
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
20
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

NoSQL na prática! Cassandra em Java

  1. 1. r. NUCQTJ na, íjlÍiáJÇllífêíÍ 'W JÉT_L'ÉSH. IT. IÍ. TÍ «emíjaizzgm Henrique Liberato henriqueliberatacombr
  2. 2. Rito @euro - Motivação NoSQL - Banco de dados colunares e Cases: Twitter ~ Esqueça a infra (por enquanto) e foco no DEV! - Client Drivers - Codiñcando: CQLJDBC eJPA. e Clusters e Hospedagem - Contato (repositório dos códigos apresentados)
  3. 3. O' IWPJ? [idm. ¡›(1›'› [Lidos " Apn-se-uun un raswmvu Aplesenldgdr) Las-youth. : Cassandra NoSQL a _ fmasanori@gmai| .com 17 de março de 2012 slidesharenetlfmasanori IWPHU ! nu-Ilan n* ! Smhra nUI Pam quam¡ m- Python [kw/ Hay - rum. . NvvSuL NusuL m (ñ N ; /45 Cassandra NoSQL JUG Vale 2012 2 099 p. ; Fernando Mnanon Fzmessu ›n FJJFL em l' md! 'r dv ÍVHÍ FMM m w msnm Úíwnl o gn Apache Cassandra e um banco de dadas dlsülhuidü tolerante a falhas escalavel e orientado a o o O colunas http: //pt. slidesharenet/ fmasanori/ cassandra-nosql-jug-vale-2012
  4. 4. UHTnsTHk§ Building ; ÉLJBVB Appllcahons with Cassandra @Hbergluud FU 701¡ (dSMHNÍYd C' . u Cassandra Day Denver 2014: Building Java " A- v jr” 'ÍÍÍX'"L°"”"”'5 C Applications with Apache Cassandra ¡tn! puma: Cassandra , ,,, <,_, ;~ ; m4 n. u «assumiu Follow a msm: : ÚTweel u 2M : http: //pt. slideshare. net/ planeteassandra/ Cassandra-day-denvcr-2o14-building-java- applications-with-apache-eassandra
  5. 5. Quem usa; Cassandra ; r , L- Adobe despegar-_com . ._ 0 -z- BlackBerry. 'àlãNEp o cu/ cist! I 8.3 Q3233 w 7 : :yRvd Ha( OEÉÉE' A A « Oh; "Jaú Emma. Pi' ERICSSON "hul" ? ÊEE “OPERA l CÍSCÔ ÉÊÉÉ: : “ souNAocLouo GÍÍHUb LBV" formspring
  6. 6. iClient Drivers @ic PLANET ' CASSANDRA PÍHNORN¡ "z i " Kuiidera client Drivers Eaisi' Czisszi n d ra . Àstvziiizix Pelops Fcedly CLlSSLHlLlYu CLlSSLIl]Lll'CllL“ Hector Storm-Cusszindru Achilles
  7. 7. Banco de dados colunares - Todos os valores de uma coluna são "fisicamente" armazenados juntos. O SGBD colunar serializa todos os valores em um conjunto de colunas. - Não perde tempo com full scan. - Rápido em operações de escrita e leitura.
  8. 8. ACID Vs BASE
  9. 9. éiIClD Atomicity -A Consistency = Isolation ~ Durability BASE Basically / íitvailable Soft state « Eventual Consistency*
  10. 10. Teorema CAP Consistencia Disponibilidade Tolerância a falhas S. Gilbert N. Lynch - http: //lpd. epfl. ch/ sgilbert/ pubs/ BrewersConjecture-SigAcLpdf
  11. 11. Processo de escrita Memtable Commit Log Á¡- ss Table SSTab| e 5573**
  12. 12. Processo de leitura Memtable a áí n¡ a SS Table SS Table SS Tabie
  13. 13. 7 8 4 )S) . mam 217. 34a ¡W8¡w. m o L ))w meu mam . wlvlü m s m ) M mrw n m4u U www 4 5 _Í 9)) Lmm SZZ 63a 3lvulvx Gabriella Arthur Alice i r a r l r r r r l l a z a o n ! n ! Fax ld3: 8412-5487 m m mm me @K mw hü . um. MM S i . ... ... ... ... ... .. -. a um n rum u a. . l man 0 &87 C 89 . .L3 MM 5M C47 n89 01.1. .645 dgô T33 12 . MM ea u" eqwr mmwmm oeanü NHGÂA kkkaw MMMM
  14. 14. Beleza, mas e na prática? Conzpressão os Materialização! É Reaistro É Nome É Telefone É Celular É Email É Fax Ê Id:1 l Henrique ã 3941-845 â 8841-2687 â hrq@hrq. com â (vazio) Id:2 Gabriella 3651-9754 (vazio) (vazio) (vazio) ¡ I ldt3 Ê Arthur Í (vazio) Ê 9741-2087 É (vazio) l 8412-5487 E ldz4 Alice (vazio) (vazio) its@lice. com (vazio) : 0101101lO100101011010101010101111101010100010101010110101010101011lO01101010100 z Nome Telefone Celular *Email 5 Fax à ldlzHenrlque E Id1:3941-845 a Id1:8841-2687 a ld1:hrq@hrq. com a ld3:8412-S487 i i Id2:Gabriella ã Id2:36S1-97S4 ê Id3:9741-2087 ê ld4zits@lice. com ° ã | d3:Arthur E Id4:Alice E E E 10101110101010110101001010110010100l l I 1010011001100011001100111100110l100110011
  15. 15. Case Twiter M ySQL to . NoSQL Data Modeling' Challenges in Supporting' Scalabilily Apolicnxim 50mm POGOSIGHQ Dainese: : Event Name 1 Tweet Id 1 -n- Tweel Id N E"" JSON m JSON name: S ' : Dal : Dale u. Even¡ Name N Tweel ld 1 -0- Twael ld N JSON 'I' JSON disponível em: <http: //epic. cs. coloradoedu/ wp-content/ uploads/ &Nfexoli schranLpdf>
  16. 16. Applications A Iicafon pp l Administration Twiner Friends Inlenace & Foilowers TwmerStalus containers Services Service Persistenoe Database
  17. 17. I Transaciionserxrice I A I I I l "f JPA/ Hibernate i i Lucena
  18. 18. Database id: long namfe¡ String createdAt: Date id: long start' Date text: String screen_name: String end: Date
  19. 19. Applications Iication App Twitter Collection a Search Spring Containers Service MySOLTwitter CassandraTwitter Slatusservice StatusService pm-gstence JPNHibemate Database Cassandra
  20. 20. Transactionservice lvlysOL Lucene Cassandra
  21. 21. labase Event Name 1 @ida Event Name N I MySQL I | Lucene I Tweet Id 1 JSON Tweet Id 1 JSON &àé @Qi 1943-12 156565 Tweet Id N JSON Tweet Id N JSON
  22. 22. Esqueça a infra (por enquanto) e foco no DEV! Datastax Community Edition (open source) DHTH5THX§ httpz/ /planetcassandraorg/ Cassandra/
  23. 23. xy_ ' | .- à, l _gi _t “gv ~ r: ,m . i s i _ ; a s: W a, v' N . m. E! nricel¡ : E t¡ l - ' A . mlllllnnm. E x t_ lan¡ , à , › nen. .. . . *É* l
  24. 24. A -TLjJ ifâjtyíjíçxã -di.
  25. 25. Inicialmente projeto proprietário do Facebook, mas teve seu código aberto em 2oo8. Projetado por: Malik Prashant (Facebook) e Avinash Lakshman (Amazon/ Dynamo). Em 201o foi aceito na incubadora de projetos da Apache e recebeu colaboração de empresas como Rackspace, Digg, Twitter e Netflix. Tem como objetivo uma alta escalabilidade, consistência eventual e alta disponibilidade. Utiliza-se do protocolo de comunicação Apache Thrift.
  26. 26. ; f: ç a, amaaricoml Zz Bigtable, 2006 DV"am°› 2007 'tl 1;! I l l: Open Source, 2008 _ Apache¡ 2009 Cassandra, 2010
  27. 27. Codiñcando no Cassandra A tradicional conexão JDBC: - Utiliza CQL Cassandra Query Language, que converte Thrift para comandos parecidos com o habitual SQL (https: //code. google. com/ a/apache-eXtras. org/ p/ cassandra-jdbc/ ). - Semelhante aos outrosJDBCs existentes. - Adicionar o . jar no classpath do projeto.
  28. 28. Cassandra CLI Utility l lCoTineeteÍ torlezst Clusteratjlocallíst :916BÍ 'llcqlsh 4.1.1 l Cassandra 2.8.6 l CQL : pec 3.1.1 l Thrift protocol 19.39.91 _ lui. .. uclv cm. mai. . Icqlsh) CRERTE KEÊSPRCE _jugkeyspace . . . UlTH REPLICHTION= (' class' : 'SímpleStrategy' , 'replicat íonjactor' :1); r cqisnz W_ *nn1nl. H _use _jugkeyspace; l r qLàlliqtlsñCyàyübü/ -cqlshiJtrgkeyspace > . nn1«h-4unLauon= na criisin3ttãkegsiaace> cruzam InBLE tlsersJug < . . . user-_key int. . . . . name Uau-char. l . .. email Uarcltar. i . . . ) PRIHHRY KEY (usei-Jay) *h ; M °. cq1sn: JugKeyspace)
  29. 29. Classe Connection Factory package jdbc; import java. sql. '; public class CassandraConnectionFactory f public Connection con = null; public Connection getConnection() throws C1assNotFoundException, SQLExceptionf / / oarém 0 DRIVER DE CONEXÃO Class. fbrName("org. apache. cassandra. cql. jdbc. CassandraDriver“); con = DriverManager . getConnectíon("jdbc: cassandra: //localhost:9160/jugkeyspace"); / /RETORNA A CONEXÃO return con;
  30. 30. Exemplo de insert package jdbc; + import java. sq1.PreparedStatement; D public class TestesJDBC f public void testeInsert() throws C1assNotFoundException, SQLExceptíonf CassandraConnectionFactory ccf = new CassandraconnectionFactory(); String sql = "insert into u5er5Jug (user_key, nane, ewai1)" + " values (? ,?, ?)"; Preparedstaterent strt ccf. getConnection(). prepareStatement(sql); l pn--Iry- -_-r -. - my. ; . m r-'V-l M: : _ _l. _._- _ . r . '4 stwt. setString(1, "01"); stwt. setString(2, "Joaozinho"); strt. setString(3, "jc@ozinho. ccw"); ífíãíCLllé. stwt. execute(); strt. c1ose();
  31. 31. Exemplo de select @Test public void testeSelectO throus SQLException, ClassNotFoundExceptionf CassandraconnectionFactory ccf = new CassandraconnectionFactory(); / /QUERY CQL QUE SERÁ EXECUTADA String query = "select * from usersJug"; Statement stmt = ccf. getConnection(). createStatenent(); Resultset rs = stmt. executeQuery(query); / / ITERAÇÃO SOBRE TODOS OS ITENS OBTIDOS uhile (rs. next())f Systen. out. print1n( rs. getInt(”user_key”)+“ | "+ rs. getString("nane")+“ | "+ rs. getString(“emai1")); Systen. out. println(Systen. Líne$eparator()); i stmt. c1ose();
  32. 32. Resultado do select exibido ru)consok3 O1 l Joaozinho | jo@ozinho. com 02 | Zequinha | zequinhálmaiLcom O3 I Mariazinha I mari@zinha. com
  33. 33. Codificando no Cassandra Persistindo comJPA: - Utilizando o Kundera (https: //github. com/ impetus- opensource/ Kundera). - Adicionar o . jar no classpath do projeto ou via Maven. - Integração com o CQL. - Outras APIS de persistência: Hector API, Easy-Cassandra (feito por um BRl).
  34. 34. Criação da classe e anotações package jpa; @import javax. persistence. Column; [ @Entity @Tab1e(name = n userslug', schema = “jugkeyspace”) public class Userslug f t' @Id private int user_key; - @Column(nane-“nane') private String name; -A @Column(nane= "enai1") private String email; -4 public int getUser_key() f return user_key; i public public public public public void setUser_key(int user_key) fthis. user_key = user_key; ] String getName() (return nane; ) void setNane(String name) fthis. name = String getEnai1() (return enailg) void setEnail(String email) fthis. eaail = emai1;) name; )
  35. 35. Classe de acesso aos dados package jpa; + import java. util. List; ; public class CassandraDAO[ cura: : as c. :l.5:›. í'3;: EntityManagerFactory erf = Persistence. createfntity#hnagerFactory("jugkeyspace"); EntityManager er = erf. createEntityHanager(); ? Test public void persistir(0bject entidade)( em. persist(entídade); em. clear(); l public void rerover(Object entidade)( em. rerove(entidade); em. clear(); l public <T› T encontrarPorID(Class<T› entityclass, Object id)( T resultado = en. find(entítyClass, id); return resultado; i : Supp"e5:_arning: ("unchecked") public List<Object› listar()f Query q = er. createQuery("select ' frcw users3ug"); return q. getResultList();
  36. 36. Exemplo de persistência e remoção public class Testes f public static void rain(String[] args) f Userslug userJug = new UsersJug(); userlug. setNare("Joaozinho"); . . I . A Y . . user J ug . setEirail( "Jcíllbzinho . ccrr' )3 ÊÍerTÍnltESÍTeSÍÊSQIJÉV: EP lcatwn' ar1az1n a rarikzin a. cor CassandraDAO cdao = new CassandraDAO(); J°a°z1nh° J°@°Z1nh°'c°" cdao. persistir(u5erJug); _ _ _ imprimiru-sta( cdao _ listar( ) n <terminated> Testes [Java Application] Mariazinha rari@zinha. cor cdao. remover(u5er]ug); imprimirLista(cdao. listar()); l public static void irprimirLista(List<UsersJug> users)f for (UsersJug user : users) f System. out. print1n(user. getName()+" "+user. getEmail() +System. LineSeparator());
  37. 37. Arquivo de configuração -. - (persistencia nlns-"httpM/ java. sun. con/ mL/ ns/ persístence' m1ns: xsi-'http: //Muv. n13. org/2001/XMLScheIia-instarrce' xsi: schenaLocation- 'http: // java. sun. con/ xiiiL/ ns/ persistence http : //java. sun. con/ mL/ ns/ persistence/ persistence_2__0. xsd' vers ion- "2. 0' › v* <persistence-unit nane= 'cassandm_pu'› <provider›con. inpetus . kundera . KunderaPersistenced provider › -. - (properties) <property nue-'kundermnodes' v¡lue-r'l. ocal. host'/ › (property nane-'kunderrhport' value-'9160'/ › <property nane-'kunderm keyspace' value- 'test'/ › (property nanefhundera. diaLect' value= "cassandra'/ › <property nanefkundera. cLient. Lookup. cLass' value= 'con. inpetus. client. cassandrmpetops. PeLopsCLientFactor-y' / › (property nane-"kunderm cachemrovider. cLass' value-'corm inpetus. kundera. cache. ehcache. EhCacheProviderV › (property nane= "hunderm cache. config. resource' value= 'Vehcache-test. xnl. "/ › (property nane-'kunderaufdhauttmprepare' value= 'create' / › (property nanefkundera. cLíent. Lookup. class' value- "com. imetus. kundera. cLíent. Cassandra. dsdriver. DSCLÍentFaCtary' / › </ properties) </ persistence-unit› (lpersistence)
  38. 38. Hi: : splfàií. agleiii- l IJ ; aaíS (D , ratab : as Seiíírice) httpsz/ /mvwinstaclustrcom/ httpz/ /ivwwtesoracom/
  39. 39. líonchisãoi lírabahioslñiuinis Ijüñudas?
  40. 40. O b IÍi§: â., lfl. l3 i ~ https: //github. com/ hliberato/ jugVale7-NoSQL-Cassandra http: //lnkd. in/ iApYMK httpz/ /virwwibcom/ safraãio http: //henriqueliberato. com. br/ henriquebmx@gmail. com

×