În ultimul an, Apache Spark a beneficiat de atenţie sporită din parte domeniilor Big Data şi Data Science, în principiu pentru că are un API mai accesibil şi o gestionare mai bună a memoriei decât MapReduce, ceea ce permite ca programatorii să se concentreze asupra operaţiilor logice care stau la baza computării sau a calculului, deci nu asupra detaliilor care se referă la modul cum aceasta este executată în spate.
Scopul acestui articol este de a introduce principalele concepte Spark şi de a ne arăta cât de uşor poate fi să învăţăm şi să scriem cod în Spark.
Conţinutul articolului tratează următoarele teme:
Istoria Apache Spark
Unde putem învăţa mai multe despre Spark?
Arhitectura Spark
Moduri simple de a rula Spark
Suport pentru limbaje multiple
RDD
Apache Spark este un proiect care a fost început în 2009 la UC Berkeley AMPLab de doi români, Matei Zaharia şi Ionel Stoica. În 2013, proiectul a fost donat către Apache Software Foundation sub licenţa Apache 2.0.
Obiectivele Spark erau să ofere un API uşor de utilizat şi o gestionare a memoriei (memory management) mult mai bună decât MapReduce, astfel încât programatorii să se poată concentra pe operaţiile logice din cadrul computării, şi nu pe detaliile modului în care aceasta este executată în spate.
Toate acestea ne pot da impresia că nu lucrăm cu un framework distribuit, care să facă codul mai uşor de înţeles, de menţinut, care să grăbească timpii de dezvoltare.
Există multe tutoriale pe Internet de unde se poate învăţa Spark, inclusiv acesta.
Însă, dacă doriţi să sacrificaţi mai mult din timpul vostru, pentru a înţelege funcţionalităţile Spark mai bine, vă recomand să citiţi cartea "Learning Spark".
Cartea se citeşte uşor, porneşte de la zero, descrie toate funcţionalităţile Spark şi conţine multe exemple practice în Java, Scala şi Python.
O altă sursă foarte bună pentru a învăţa Spark este propria lor documentaţie publică (public documentation). Marele avantaj al acesteia este că include cele mai noi feature-uri Spark. De exemplu, la momentul scrierii acestui articol, cartea"Learning Spark" se referă la Spark 1.3, în timp ce ultima documentaţie prezintă Spark 1.6.
Dacă doriţi să învăţaţi Spark, vă recomand să începeţi cu cartea şi doar apoi să apelaţi la documentaţia care descrie ultimele feature-uri. Prefer să încep cu cartea deoarece prezintă informaţia în ordinea corectă şi deoarece o explică foarte bine.
După părerea mea, aici găsim adevărata valoare a lui Spark. Dacă învăţaţi fundamentele Spark Core, puteţi să le aplicaţi în mai multe contexte de lucru precum procesarea batch, machine learning, SQL, procesare streaming şi procesare de graph-uri. Mai mult, aveţi posibilitatea de a combina, de exemplu, codul batch cu codul SQL în acelaşi fişier al unei clase Java. Imaginaţi-vă câte linii de cod Java ar fi necesare pentru a completa următorul statement SQL"select * from user_table where location = "US" order by age desc".
Ecosistemul Hadoop este foarte mare şi include framework-uri diferite pentru diverse contexte de lucru: Hive pentru SQL, MapReduce pentru procesare batch, Giraph pentru procesare de graph-uri, Storm pentru procesare în timp real, Mahout pentru machine learning. Dacă doriţi să învăţaţi/lucraţi cu mai multe contexte de lucru de acest fel, va trebui ca, de fiecare dată, să învăţaţi un nou framework. Spark integrează toate aceste contexte, astfel încât perioada de învăţare, atunci când se trece de la procesare batch (Spark Core) la procesare în timp real (Spark Streaming) să fie mai mică decât atunci când se trece de la MapReduce la Storm, de exemplu.
Primul lucru la care trebuie să vă gândiţi înainte de a scrie cod Spark este că aveţi nevoie de un cluster de calculatoare și abilităţi Linux pentru a crea un cluster. Probabil că vă gândiţi să renunţaţi la a scrie cod Spark în acest moment.
Mai jos voi prezenta câteva moduri simple de a rula codul Spark.
1.IDE-ul vostru preferat (ex. IDEA, Eclipse pentru Java)
Puteţi să scrieţi şi să vă testaţi codul direct de pe IDE-ul vostru, fără vreun cluster Spark.
2.Lansare de sine stătătoare (standalone)
Dacă trebuie să accesaţi funcţionalităţile unui cluster Spark, puteţi lansa Spark pe o singură maşină (calculator). Trebuie doar să descărcaţi o versiune pre-build de Spark, să o dezarhivaţi (unzip) şi să rulaţi ſcript-ul sbin/start-all.sh. Puteţi citi mai multe detalii aici (here).
3.Amazon EMR
Utilizând serviciul EMR, puteţi lansa clusterul Spark pe mai multe maşini, utilizând doar o pagină web şi un mouse. Consultaţi documentaţia Amazon pentru un tutorial complet. Singurul dezavantaj este că vă va costa ceva bani.
4.Furnizori Hadoop
Cei mai mari furnizori Hadoop sunt Cloudera şi Hortonworks. Hadoop oferă maşini virtuale (virtual machines) pe care le puteţi descărca şi instala pe calculatorul vostru. Astfel veţi avea un singur cluster Hadoop, cluster care va conţine serviciul Spark.
5.Cum utilizăm Docker
Puteţi urmări acest tutorial (video tutorial) pentru a vedea cum Docker şi Zeppelin vă pot ajuta să rulaţi exemplele Spark.
Apache Spark asigură suport nativ pentru Scala, Java, Python şi, mai recent, pentru R language, deci o gamă largă de programatori se pot folosi de Spark.
Spark este scris, în mare parte, în Scala, şi rulează într-un JVM container, deci are o performanţă bună pentru Java. Python este un limbaj integrat care asigură o performanţă bună prin utilizarea inteligentă a Py4J.
RDD este doar o colecţie imutabilă (permanentă), distribuită de obiecte.
Pornind de la imaginea de mai sus, putem să ne imaginăm RDD drept o colecţie de caractere (pentru Java), partiţionate şi distribuite pe mai multe maşini (calculatoare). Partiţiile sunt unităţile de distribuţie pentru RDD, similare blocurilor de date pentru HDFS.
RDD este modalitatea prin care Spark asigură o gestionare bună a datelor (data management) în timpul execuţiei, un pe care MapReduce nu îl oferă.
Orice aplicaţie Spark presupune două tipuri de operaţii: transformări şi acţiuni (transformations and actions).Transformările vă permit să creaţi un nou RDD dintr-un alt RDD.
Diagramele de mai jos ilustrează două dintre operaţiile cele mai frecvente: map şi filter (filtrarea).
Pentru cazul transformării de tip « map », din imaginea de mai jos, Spark iterează distribuit pentru fiecare element şi incrementează valoarea cu o unitate, rezultând astfel un nou RDD, numit MapRDD.
Toate transformările din Spark sunt leneşe.
Acţiunea calculează un rezultat dintr-un RDD.
Un exemplu de acţiune este count(), care returnează numărul de elemente dintr-un RDD.
Acţiunile luate returnează un şir cu elementele RDD, iar saveAsTextFile() persistă elementele RDD pe o sursă externă de date, precum HDFS.
Gata cu teoria!
În cadrul prezentării de la TSM, vă voi arăta mostre de cod Spark care vor include toate exemplele descrise în acest articol.
Dacă doriţi să aflaţi mai multe despre Spark şi alte framework-uri BigData, vă invit să vă abonaţi la BigData/DataScience community from Cluj.