miércoles, 25 de marzo de 2009

Hadoop

Els que estigueu posats en el món de l'informàtica distribuïda o bé d'alt rendiment o bé, simplement que esteu una mica a l'aguait de les novetats informàtiques potser us sonarà Hadoop.

Hadoop és una plataforma de software que bàsicament permet escriure programes que processin unes grans quantitats de dades. Grans grans. El projecte ja té diversos anys i alguns dels seus components s'han separat en subprojectes:

  • Hadoop Core: Plataforma de Map Reduce + Sistema de fitxers distribuit.
  • HBase: Una base de dades distribuïda i escalable.
  • Pig: Nivell d'alt llenguatge per aplicacions que utilitzen Hadoop-core.
  • ZooKeeper: Sistema de coordinació per Hadoop.
  • Hive: Una espècie de SQL fer queries a les dades emmagatzemades en Hadoop (moltes dades, moltes moltes)

És un projecte Open Source utilitzat en producció (molt important) en diverses empreses, tal com podeu veure aquí. A més, té una comunitat d'usuaris / desenvolupadors molt activa tal com podreu veure si doneu un tomb pel seu tracker

En aquest post parlaré exclusivament del projecte principal, Hadoop Core.

Les característiques que ells destaquen en la seva pàgina són les següents: 

  • Escalabilitat: Pot manejar grans quantitats de dades (petabytes) i té escalabilitat horitzontal, és a dir, si necessites més potència o més espai, simplement afegeixes màquines.
  • Econòmic: És Open Source (llicència Apache) i treballa amb qualsevol tipus de màquines, no és necessari que siguin servidors d'alta gamma. A més, és una plataforma de software que suposa que els errors de hardware són usuals i per tant, sap reaccionar. També cal destacar que està preparat per còrrer al Amazon EC2
  • Segur: Sempre es mantenen diverses còpies de les dades repartides en diverses màquines, així ens estalviem desgràcies quan una màquina decideix morir sense avisar. 

Hadoop és capaç de processar grans quantitats de dades perquè utilitza Map Reduce. Map Reduce és un model de programació pensat, o més bé, readaptat, per procés de moltes dades. Amb això voldria aclarar que de fet, només serveix per això. Sembla ser que hi ha certa moda en utilitzar Map Reduce en alguna de les seves implementacions per moltes coses. Si no es té una entrada de com a mínim gigues de dades probablement no sigui el que es necessita.

Bé, els causants de tota aquesta febre MR (Map Reduce) van ser Google quan van publicar un article on explicaven què era, com es programava i com ho utilitzaven en producció a diari en els seus clústers. A partir d'aquí van començar a aparèixer implementacions d'aquest model de programació en diversos llenguatges, una de les més importants, si no és la que més és sens dubte Hadoop. 

En resum, MR i per tant Hadoop treballen de la següent manera (molt per sobre):

Tenim les dades al sistema de fitxers distribuit que comparteixen totes les màquines que conformen el nostre clúster. Tenim un programa que implementa MR mitjançant Hadoop, això bàsicament vol dir que hem programat un programa semblant a aquesta, el qual té una classe Mapper, amb un mètode map i una classe Reducer amb un mètode reduce

Hadoop parteix el clúster en mappers i reducers, una màquina pot ser mapper i reducer a l'hora, això es pot definir en la configuració del sistema. Les màquines que fan de mappers agafen les dades del sistema de fitxers distribuit i li apliquen la funció map. Així de bon principi ja tenim tot de màquines que estan llegint les dades d'entrada de forma paral·lela. 

MR té uns requeriments per les dades. Bàsicament han d'esser de la forma. Clau -> Valor, on la clau i el valor poden ser qualsevol cosa. Per tant, un cas típic seria un log d'apache:


127.0.0.1 - - [31/Jul/2008:00:37:04 +0100] "GET /~marc/images/imatge1.jpg HTTP/1.1" 200 16624
127.0.0.2 - - [31/Jul/2008:00:37:05 +0100] "GET /~marc/images/imatge2.jpg HTTP/1.1" 200 16624
127.0.0.3 - - [31/Jul/2008:00:37:06 +0100] "GET /~marc/images/imatge3.jpg HTTP/1.1" 200 16624
127.0.0.1 - - [31/Jul/2008:00:37:04 +0100] "GET /~marc/images/imatge3.jpg HTTP/1.1" 200 16624
Per exemple en aquest programa ens interessa saber quines IPs han agafat quines imatges. Per tant podriem dir-li al mapper que la clau de sortida sigui la imatge, i que el valor de la clau sigui la IP: 

Clau Valor
imatge1.jpg 127.0.0.1 
imatge2.jpg 127.0.0.2 
imatge3.jpg 127.0.0.3 
imatge3.jpg 127.0.0.1
Ok, per cada Clau/Valor que el mapa troba l'envia a un reducer. És important notar que no associa res de res, en aquest cas enviarà una clau/valor per cada linia de fitxer. Aquesta és una part molt interessant ja que el mètode map simplement invoca una funció amb la clau i el valor com a paràmetres i se n'oblida. Aquests valors són emmagatzemats "màgicament" al sistema de fitxers distribuit de forma totalment transparent fins que tots els mappers han acabat. Això vol dir que els reducers no comencen a processar les dades fins que els mappers estiguin (en veritat si que comencen en certa manera, però no és important ara). Hadoop té un particionador de manera que, atenció que això és important, cada reducer (cada instància d'un reducer) rep una i només una clau amb una llista dels valors: Això és una mica espinós per entendre, exemple:

Clau 1 / Valor A
 Clau 2 / Valor B
 Clau 3 / Valor A
 Clau 2 / Valor A
 Clau 3 / Valor C
I el reducer rebrà:

Reducer1 : Clau 1 amb una llista que contindrà: Valor A
Reducer2 : Clau 2 amb una llista que contindrà: Valor B, Valor A
Reducer3 : Clau 3 amb una llista que contindrà: Valor A, Valor C 
Per tant hi haurà tants reducers com claus tingui la sortida el mapper. En l'exemple anterior es tradueix a: 

imatge1.jpg 127.0.0.1
imatge2.jpg 127.0.0.2
imatge3.jpg 127.0.0.3, 127.0.0.1
Llavors lògicament el reducer pot fer el que vulgui amb aquestes dades. L'exemple aquest és extremadament senzill, però pensem que un map i un reduce complex poden fer les mil i una bestieses i si estem parlant d'un fitxer de log complert d'apache d'alguna pàgina important pot ser molt i molt gros.

Un cop el reduce està també escriu els resultats en forma clau valor. Aquests resultats són guardats al sistema de fitxers distribuit. 

Podeu trobar molta més informació sobre Map/Reduce + Hadoop al tutorial de hadoop. 

Bé, en pròxims articles entraré més en detalls sobre Hadoop i probablement publicaré snippets de codi, amb problemes que em vaig trobant al dia a dia i alguns números.

2 comentarios:

  1. Prou bó l'article. Jo sóc dels que creu que el MR és una moda sense massa sentit... el HDFS té un potencial brutal (tot i que crec que està massa encarat a fer MR, pero amb algunes modificacions podries tenir un FS molt bó per moltes coses).

    El MR en si, em sembla una forma de encapsular una tasca molt concreta (que m'agradaria veure la diferencia d'eficiencia amb approaches menys marketininanes), que es pot aplicar a moltes coses, pero que alguna cosa es pugui fer, no implica que sigui la més adient. He dit.

    ResponderEliminar
  2. Bé, és una manera de veure-ho. Em sembla que ja ho he posat a l'article, i de fet, era un dels motius per escriure'l, que el Map Reduce ara mateix és una moda i que últimament es veuen molts d'usos _no_ justificats.

    La gràcia d'utilitzar MR és que et dona molta feina feta, sobretot en l'accés a dates i les particions d'aquestes.

    ResponderEliminar

Comenta: