{"id":749,"date":"2015-12-28T13:06:06","date_gmt":"2015-12-28T12:06:06","guid":{"rendered":"http:\/\/www.datascience.rs\/?p=749"},"modified":"2015-12-28T13:06:06","modified_gmt":"2015-12-28T12:06:06","slug":"apache-spark-organizacija-podataka","status":"publish","type":"post","link":"http:\/\/imuno-srbija.com\/data-science\/en\/2015\/12\/28\/apache-spark-organizacija-podataka\/","title":{"rendered":"Apache Spark &#8211; organizacija podataka"},"content":{"rendered":"<p>\u0106ao svima. \ud83d\ude42 Nedavno su u okviru na\u0161e <a href=\"http:\/\/www.meetup.com\/Data-Science-Serbia\/\" target=\"_blank\" rel=\"noopener\">meetup grupe<\/a> odr\u017eana dva predavanja o Apache Spark-u. <a href=\"http:\/\/www.meetup.com\/Data-Science-Serbia\/events\/226970796\/\" target=\"_blank\" rel=\"noopener\">Prvi meetup<\/a> je bio fokusiran na teoriju o HDFS-u i Spark-u, i sve one funkcionalnosti koje ove alate \u010dine zna\u010dajnim za rad sa podacima. <a href=\"http:\/\/www.slideshare.net\/darkomarjanovic\/big-data-tools-in-practice\" target=\"_blank\" rel=\"noopener\">Prezentacija<\/a> je dostupna na SlideShare-u. <a href=\"http:\/\/www.meetup.com\/Data-Science-Serbia\/events\/227356896\/\" target=\"_blank\" rel=\"noopener\">Na drugom meetup-u<\/a> smo govorili detaljnije o Spark-u, i pokazali demo aplikacije na okru\u017eenju koje nam je obezbedio <a href=\"https:\/\/databricks.com\/\" target=\"_blank\" rel=\"noopener\">Databricks<\/a>, pa im se ovom prilikom zahvaljujemo na ukazanom poverenju.<\/p>\n<p>\u0160ta je Apache Spark i kako po\u010deti sa njim mo\u017eete pro\u010ditati u tekstu <a href=\"http:\/\/www.datascience.rs\/apache-spark-kako-poceti\/\" target=\"_blank\" rel=\"noopener\">Apache Spark &#8211; Kako po\u010deti?<\/a> U ovom tekstu \u0107u se detaljnije pozabaviti osnovnim organizacionim jedinicama podataka u Spark-u, o kojima smo govorili na prethodnim okupljanjima.<\/p>\n<h2>Resilient Distributed Datasets<\/h2>\n<p>Osnovu Sparka \u010dine Resilient Distributed Datasets, odnosno RDDs. RDD predstavlja osnovnu apstrakciju memorije u Spark-u, koja developerima omogu\u0107ava izvr\u0161avanje ra\u010dunskih operacija nad podacima unutar velikih klastera koriste\u0107i njihovu memoriju, i pritom \u010duva fault tolerance svojstvo, poput MapReduce-a. Ukoliko neka od ma\u0161ina u klasteru ne mo\u017ee da zavr\u0161i neki zadatak, ili ima nekih problema sa hardverom, samo deo posla koji je bio na toj ma\u0161ini \u0107e se ponovo izvr\u0161iti na drugoj ma\u0161ini, bez uticaja na zadatke koji se izvr\u0161avaju na ma\u0161inama koje pravilno funkcioni\u0161u. Predstavljaju particionisane kolekcije objekata rasprostranjene u klasteru, koje se \u010duvaju u memoriji ili na disku. Neka od osnovnih svojstava RDD-ova su:<\/p>\n<ul>\n<li>Immutability &#8211; predstavljaju strukturu podataka koja se ne mo\u017ee izmeniti. Prilikom izvr\u0161avanja neke operacije nad RDD-ovima koja zahteva njihovu izmenu ili generisanje neke nove promenljive, dobija se novi RDD. Na taj na\u010din vi\u0161e RDD komponenti oslikava razli\u010dite verzije seta podataka, pa se dobija \u201cmutable\u201d svojstvo.<\/li>\n<li>Lineage &#8211; za svaki RDD se \u010duvaju podaci o tome kako je isti dobijen. Ukoliko tokom izvr\u0161avanja programa do\u0111e do otkaza neke ma\u0161ine u klasteru, RDD-ovi se mogu ponovo iskalkulisati od nule, a da to pritom ne uti\u010de na RDD-ove koji se nalaze na ostalim ma\u0161inama. Omogu\u0107eno je da ukoliko do\u0111e do gubitka podataka iz bilo kojih razloga tokom izvr\u0161avanja nekog programa, ti isti podaci se mogu ponovo efikasno iskalkulisati. Pored toga, lineage omogu\u0107ava lazy evaluation Spark transformacija podataka.<\/li>\n<li>Fault tolerance &#8211; omogu\u0107ena je kroz logovanje svih izmena nad setom podataka, odnosno pojedina\u010dnim izmenama koje se izvr\u0161avaju nad mno\u0161tvom zapisa. Posti\u017ee se kroz lineage i Write Ahead logove (veoma zna\u010dajni za Spark Streaming).<\/li>\n<\/ul>\n<p>RDD se mo\u017ee kreirati u\u010ditavanjem podataka iz nekog storage sistema, poput HDFS-a ili nekog drugog, transformacijom nekog postoje\u0107eg RDD-a, ili pozivanjem funkcije parallelize nad nekom listom podataka u Python-u (ukoliko se koristi Python API za Spark, poznatiji kao PySpark).<\/p>\n<p>Dva tipa RDD operacija je podr\u017eano:<\/p>\n<ul>\n<li>Transformacije. Osnovna karakteristika transformacija je da su lazy evaluated, \u0161to zna\u010di da kada se pozove neka transformacija nad nekim RDD-om, ni\u0161ta se ne de\u0161ava. Zapravo, program tada samo pamti \u0161ta je potrebno uraditi, a sama transformacija \u0107e se izvr\u0161iti tek kada na nju nai\u0111e neka akcija. Izvr\u0161avanjem transformacije se dobija novi RDD. Neke od naj\u010de\u0161\u0107ih kori\u0161\u0107enih transformacija su <i>map<\/i>, <i>filter<\/i> i <i>join<\/i>.<\/li>\n<li>Akcije. Akcija je u Spark-u operacija koja se izv\u0161ava odmah. Pozivanjem akcije se izvr\u0161avaju i sve transformacije nad podacima koje su prethodno pozvane. Predstavljaju mehanizam kojim se uzimaju podaci iz Spark-a. Naj\u010de\u0161\u0107e kori\u0161\u0107ene akcije su <i>collect<\/i>, koja u terminalu vra\u0107a podatke koji se nalaze u RDD-u, i <i>count<\/i>, koja vra\u0107a broj redova u RDD-u nad kojim je pozvana. Akcije uvek imaju neki output za krajnjeg korisnika.<\/li>\n<\/ul>\n<p>\u010cesto kori\u0161\u0107ena funkcija u Spark-u je <i>cache()<\/i>, koja \u010duva u memoriji RDD nad kojim je pozvana. Na taj na\u010din korisnik koji razvija program obezbe\u0111uje da mu se neki podaci koje \u0107e kasnije koristiti \u010duvaju u memoriji, kako se ne bi morali ponovo u\u010ditavati sa diskova.<\/p>\n<p>Dodatna literatura o RDD-ovima je dostupna u radu <a href=\"https:\/\/www.cs.berkeley.edu\/~matei\/papers\/2012\/nsdi_spark.pdf\" target=\"_blank\" rel=\"noopener\">Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing<\/a> sa Berkley Univerziteta, gde je Spark i razvijen.<\/p>\n<h2>Spark Dataframes<\/h2>\n<p>Dataframe predstavlja \u010desto kori\u0161\u0107enu apstrakciju podataka u mno\u0161tvu programskih jezika za rad sa podacima. Predstavljaju strukturu podataka poput tabele ili matrice, gde se u svakoj koloni \u010duvaju merenja neke varijable, a svaki red predstavlja jednu opservaciju, odnosno jedan zapis. U R jeziku predstavljaju jednu od osnovnih struktura podataka, a u Python-u se mogu koristiti kroz Pandas bibilioteku.<\/p>\n<p>Spark Dataframe predstavlja distribuiranu kolekciju podataka koji su organizovani kao tabela ili matrica. Po nekim osnovnim karakteristikama su sli\u010dni RDD-ovima, jer se tako\u0111e mogu \u010duvati u memoriji, i podr\u017eavaju lazy evaluation. Osnovna razlika izme\u0111u njih se ogleda u tome \u0161to Spark mo\u017ee optimizovati Dataframe operacije, jer svaki Dataframe sadr\u017ei metapodatke o tipovima podataka koji se nalaze u kolonama, \u0161to nije slu\u010daj kod RDD-a.<\/p>\n<p>Spark Dataframe se mo\u017ee kreirati na vi\u0161e na\u010dina, poput u\u010ditavanja strukturiranih fajlova sa podacima (poput CSV i JSON fajlova), iz eksternih baza, od postoje\u0107e Hive tabele (ukoliko se koristi u kombinaciji sa Hadoop-om), transformacijom RDD-a, \u2026 Kori\u0161\u0107enjem dataframe-ova u Spark programu omogu\u0107ene su sve \u201ckonvencionalne\u201d operacije nad podacima koje bismo imali u nekoj relacionoj tabeli, kao \u0161to su se\u010denje tabele, sortiranje redova, agregacije, join sa drugim dataframe-ovima, \u2026<\/p>\n<p>Dataframe kao koncept postoji u Spark-u od verzije 1.3. Poput RDD-a, i Dataframe-ovi podr\u017eavaju lazy evaluation, \u010dime se smanjuju stanja \u010dekanja prilikom izvr\u0161avanja programa i omogu\u0107ava bolji pipelining procesa. Za rad sa njima je mogu\u0107e pisati DSL jezik u Java-i, Scala-i ili Python-u. Pored toga, njihovim uvo\u0111enjem omogu\u0107eno je pisanje SQL upita u Spark programu, koriste\u0107i klasu SQLContext. Veoma lako se mogu integrisati sa Pandas dataframe-ovima ukoliko se koristi PySpark, a na taj na\u010din i sa ostalim Python bibliotekama za rad sa podacima.<\/p>\n<p>Benefiti koji su posti\u017eu kori\u0161\u0107enjem Spark Dataframe-ova se odnose na pobolj\u0161anje performansi izvr\u0161avanja programa i fleksibilnost manipulacije podacima. Posbeno je zna\u010dajna integracija sa Pipeline MLlib API-jem,\u00a0\u0161to unapre\u0111uje performanse algoritama ma\u0161inskog u\u010denja u Spark-u. PySpark je postao i ravnopravan igra\u010d u kori\u0161\u0107enju za Spark programe u odnosu na Scala-u i Java-u, \u0161to se najbolje oslikava benchmark testom sprovedenim od strane kompanije Databricks:<\/p>\n<p><img loading=\"lazy\" class=\"\" src=\"https:\/\/databricks.com\/wp-content\/uploads\/2015\/02\/Screen-Shot-2015-02-16-at-9.46.39-AM-1024x457.png\" alt=\"\" width=\"1024\" height=\"457\" \/><\/p>\n<h2>Dataset API<\/h2>\n<p>Za Spark 1.6 najavljen je novi API, pod nazivom Dataset API, koji predstavlja ekstenziju Dataframe API-ja, i kojim se garantuju jo\u0161 bolje performanse, ali za to nam preostaje da sa\u010dekamo da Spark 1.6 bude spreman za download i kori\u0161\u0107enje.<\/p>\n<!--themify_builder_content-->\n<div id=\"themify_builder_content-749\" data-postid=\"749\" class=\"themify_builder_content themify_builder_content-749 themify_builder tf_clear\">\n    <\/div>\n<!--\/themify_builder_content-->","protected":false},"excerpt":{"rendered":"<p>\u0106ao svima. \ud83d\ude42 Nedavno su u okviru na\u0161e meetup grupe odr\u017eana dva predavanja o Apache Spark-u. Prvi meetup je bio fokusiran na teoriju o HDFS-u i Spark-u, i sve one funkcionalnosti koje ove alate \u010dine zna\u010dajnim za rad sa podacima. Prezentacija je dostupna na SlideShare-u. Na drugom meetup-u smo govorili detaljnije o Spark-u, i pokazali [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[30,25],"tags":[],"_links":{"self":[{"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/posts\/749"}],"collection":[{"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/comments?post=749"}],"version-history":[{"count":0,"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/posts\/749\/revisions"}],"wp:attachment":[{"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/media?parent=749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/categories?post=749"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/imuno-srbija.com\/data-science\/en\/wp-json\/wp\/v2\/tags?post=749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}