Continuând seria de articole despre "big data", începută cu introducerea în lumea "big data" în numărul 2 al revistei și urmată de articolul despre bazele de date de tip "nosql" din numărul 3, a venit rîndul unui articol care să prezinte mai pe larg una din tehnologiile semnificative din lumea "big data" și anume Apache Hadoop.
Apache Hadoop este un framework care facilitează procesarea unor seturi de date mari și foarte mari, pe mai multe calculatoare folosind un model de programare simplu: paradigma map/reduce. Este proiectat în așa fel, încît să scaleze de o mașiniă la mii de mașini, fiecare din ele punînd la dispoziție putere de procesare și spațiu de stocare. În loc să se bazeze efectiv pe hardware pentru "high-availability", framework-ul în sine este proiectat în așa fel încît să detecteze erorile la nivel de aplicație.
Este un proiect open source aflat sub tutela Apache Foundation, cu o comunitate globală de contributori, dintre care cel mai semnificativ la dezvoltarea lui a fost Yahoo!.
Apache Hadoop este folosit de Yahoo! pentru motorul de căutare, Facebook se laudă cu cel mai mare cluster de Hadoop (30 petabytes de date), folosit pentru printre altele și la Facebook Messaging.
Amazon pune la dispoziție o platformă de tip MapReduce ca parte a Amazon Web Services numită Amazon Elastic MapReduce.
Numeroase alte firme din IT și nu doar folosesc Apache Hadoop (Twitter, IBM, HP, Fox, American Airlines, Foursquare, Linkedin, Chevron, etc), pentru a-i ajuta în rezolvarea problemelor de diverse tipuri: călătorii online, e-commerce, detectare de fraude, procesare de imagini, sănătate, etc
Hadoop a fost creat de către Doug Cutting, care l-a numit după jucăria de pluș a fiului lui.
A fost dezvoltat inițial pentru a oferi un sistem distribuit pentru motorul de căutare Nutch, prin anii 2004-2006 și se bazează pe articolele despre GFS (Google File System) si MapReduce făcute publice de către Google în perioada respectivă.
În anul 2006 Yahoo! a angajat o echipă dedicată (inclusiv pe Doug), care a contribuit semnifcativ la dezvoltarea frameworkului, care între timp a devenit un proiect de sine stătător, independent de Nutch.
Apache Hadoop este dezvoltat în Java și are două componente principale:
Este un sistem de fișiere distribuit care pune la dispoziție acess, cu throughput ridicat, la datele applicațiilor.
HDFS dispune de o arhitectură de tip master/slave. Un cluster HDFS este compus (de obicei) dintr-un singur Namenode, un server master care gestionează namespace-ul sistemului de fișiere și reglementează accesul clienților la fișiere. În plus, există un număr de servere Datanode, de obicei unul pentru fiecare mașină din cluster, care gestionează spațiul de stocare al mașinii pe care rulează. HDFS expune un namespace al sistemului de fișiere și permite stocarea datelor utilizator in fișiere. Intern, un fișier este împărțit în unul sau mai multe blocuri (dimensiunea blocului este configurabilă, de obicei este între16-128 MB), iar aceste blocuri sunt stocate pe Datanode-uri. Namenode-ul execută operații asupra sistemului de fișiere, precum: deschiderea, ștergerea, redenumirea fișierelor și a directoarelor. Totodată determină și maparea blocurilor de date la Namenode-uri. Datanodurile sunt responsabile pentru servirea cererilor de citire și scriere primite de la clienții sistemului de fișiere. De asemenea, Datanode-urile execută operații de creare, ștergere și replicare de blocuri, ca urmare a comenzilor primite de la Namenode.
HDFS implementează un model de permisi pentru fișiere și directoare care împărtășește mult cu modelul POSIX.
MapReduce este un framework care permite scrierea de aplicații care proceseză cantitați mari de date, în paralel, într-un mod sigur și cu toleranță la erori.
Un job MapReduce împarte setul de date de intrare în părți independente care sunt procesate de task-urile de map în paralel. Framework-ul sortează si concatenează output-ul task-urilor de map fiind pe urma folosit ca și date de intrare pentru task-ul de reduce. Tipic, atît datele de intrare cît si cele de ieșire sunt stocate în HDFS. Framework-ul are grijă de planificarea rulării task-urilor, monitorizarea lor, precum și re-executarea task-urilor cu erori.
De obicei, nodurile de calcul și cele care stochează datele (Datanode) sunt aceleași. Cu alte cuvinte, framework-ul MapReduce și HDFS-ul rulează pe același set de noduri. Această configurație permite framework-ului să planifice rularea task-urilor pe nodurile pe care datele de intrare sunt deja prezente, rezultând în optimizarea traficului de date din rețeaua cluster-ului.
MapReduce constă dintr-un singur proces master JobTracker, și câte un proces TaskTracker pentru fiecare nod din cluster. JobTracker-ul este responsabil cu planificarea task-urilor pe TaskTracker-e. Totodată ține evidența taskurilor de MapReduce care rulează pe diferite TaskTracker-e, dacă vreunul din aceste task-uri nu reușește, realocă task-ul altui TaskTracker. În termeni simpli JobTracker trebuie să se asigure ca un query pe un set de date mare se execută cu success și că rezultatul ajunge la client într-un mod sigur.
TaskTracker excută task-urile de map și reduce, care-i sunt asignate de către JobTracker.
Totodată TaskTracker trimite constant mesaje de heartbeat către JobTracker, fapt care ajută JobTracker-ul să decidă dacă poate delega un nou task nodului respectiv, sau dacă trebuie să re-execute respectivul task pe alt nod din cauza erorilor.
Pentru a specifica un job MapReduce, applicațiile trebuie să specifice cel puțin următoarele: locația în HDFS a datelor de intrare, locația unde vor fi stocate datele de ieșire, o funcție de map și o funcție de reduce. Acestea precum și alți parametri ai jobului alcătuiesc configurația jobului.
Odată ce sunt create jobul si configurația, utilizatorul le poate înainta JobTracker-ului, care își va asuma responsabilitatea pentru planificarea rulării jobului, precum și a distribuirii și rulării pe node-urile TaskTracker, monitorizarea lor, precum și expunerea statusului către utilizator.
Datele de intrare sunt trimise către funcția map ca perechi cheie-valoare, care la rîndul ei produce perechi cheie-valoare, posibil de alt tip. Odată ce partea de map s-a terminat, rezultatele, de tip cheie-valoare, de la toate map-urile sunt concatenate și mai apoi ordonate servind ca date de intrare pentru funcția de reduce, aceasta va produce rezultate tot de tip perechi cheie-valoare.
Implementarea curentă a framework-ului MapReduce începe să-și arate vîrsta. Observând trendurile în dimensiunea și puterea de procesare a clusterelor Hadoop, componenta JobTracker are nevoie de o drastică reproiectare pentru a adresa deficiențele de scalabilitate, memorie consumata, model de threading si performanță.
Cerințele pentru framework-ul MapReduce, care să satisfacă toate limitarile menționate anterior ar fi:
Următoarea generație MapReduce a fost proiectată pentru a adresa limitările menționate anterior și totodată să satisfacă cerințele de mai sus.
Ideea fundamentală a rearhitecturării, a fost sa se împartă cele doua funcții majore ale JobTracker, managementul resurselor și programarea/monitorizarea joburilor, în componente separate. Noul ResourceMananger se ocupă de alocarea globală a resurselor de calcul pentru aplicații, iar câte un ApplicationMaster per aplicație se ocupă de coordonarea/planificarea aplicației. O aplicație este fie un singur job MapReduce sau un DAG (directed acyclic graph) de joburi.
Figura 2. Arhitectura MRv2
ResourceManager-ul si serverul slave NodeManager, al fiecărei mașini, care dirijează procesele user de pe masina respectivă, formeaza structura de calcul. ApplicationMaster-ul, per aplicație, este de fapt o librărie a framework-ului a cărei rol este de a negocia resursele de la ResourceManager, și a lucra cu NodeManger(i) pentru a executa și monitoriza task-urile.
ResourceManager-ul are doua componente principale:
Scheduler-ul este responsabil cu alocarea resurselor pentru diferitele aplicații care rulează, supuse constrîngerilor de capacitate, cozi, etc. Scheduler-ul este un planificator pur, în sensul că nu se ocupă de monitorizarea sau urmărirea statusului aplicației. Totodata nu oferă nici o garanție cu privire la restartarea taskurilor cu erori, datorate fie erorilor hardware sau la nivel de aplicație.
Scheduler-ul își executa funcția de planificator bazat pe nevoile de resurse ale aplicațiilor, și face asta bazându-se pe noțiunea de Resource Container, care încorporează elemente ca memorie, procesor, disc, rețea, etc.
Scheduler-ul permite o politică de tip plug-in, responsabilă cu împărțirea resurselor clusterului între diferitele cozi, aplicații, etc. Scheduler-ul standard folosește FIFO. Planificatoarele MapReduce existente, precum CapacityScheduler și FairScheduler ar fi exemple plugin-uri.
CapacityScheduler-ul permite cozi ierarhice, pentru a oferi o mai predictibilă partajare a resurselor clusterului. A fost dezvoltat de către Yahoo!. Menirea FairScheduler-ului este să ofere timpi de execuție rapizi pentru joburile mici și QoS (quality of service) pentru joburile de producție.
ApplicationsManager-ul este responsabil cu acceptarea joburilor, negocierea primului container pentru execuția ApplicationMaster-ului specific aplicației, și oferă serviciul pentru restartarea ApplicationMaster-ului în caz de eroare.
NodeManager-ul este, procesul, per mașină, responsabil cu lansarea containerelor aplicațiilor, monitorizarea utilizării resurselor, de către aplicații, și raportarea către Scheduler.
ApplicationMaster-ul, per aplicație, este responsabil cu negocierea de containere de resurse de la Scheduler, urmărirea statusului si monitorizarea progresului.
MRv2 face parte dintr-un release major de Hadoop (2.x) care pe lîngă MRv2 include și HDFS Federation.
HDFS Federation vine să rezolve o altă posibila limitare a framework-ului, și anume natura singulară a Namenode-ului.
Pentru a putea scala orizontal serviciul de nume, federația folosește mai multe Namenode-uri independente, fiecare din ele avînd un namespace, al sistemului de fișiere, diferit. Namenode-urile sunt independente și nu necesită o coordonare a lor. Datanode-urile sunt folosite ca și spațiu comun de stocare al blocurilor de date, de către toate Namenod-urile. Fiecare Datanode se înregistrează la toate Namenode-urile din cluster și raspunde la comenzile primite de la acestea. Totodata trimit periodic heartbeat-uri, precum și rapoarte la Namenode-uri.
Dezoltarea Apache Hadoop a dus cu sine și la dezvoltarea unui adevărat eco-system de tool-uri/framework-uri adiacente, unele bazate pe Hadoop altele folosite pentru a facilita anumite aspecte ale folosirii Hadoop.
Enumerăm mai jos cîteva dintre cele mai importante.
Acest articol se vrea o introducere în ceea ce înseamnă Apache Hadoop și a unor technologii ce-l înconjoară. Pentru cei interesați de mai multe detalii, numeroase surse sunt disponibile pe internet incepând cu http://hadoop.apache.org. De asemenea, există o mulțime de soluții comerciale bazate pe Apache Hadoop, una din cele mai cunoscute fiind cea oferită de Cloudera (www.cloudera.com - aici existând și numeroase prezentări precum și traininguri).
de Radu Popescu
de Ionel Mihali
de Tavi Bolog