Salta el contingut

Hadoop, HDFS i YARN

Introducció

Apache Hadoop va néixer d'una necessitat real: Google havia publicat el 2003 el paper del Google File System (GFS) i el 2004 el de MapReduce, però el codi era propietari. Doug Cutting i Mike Cafarella van crear Hadoop el 2006 com a reimplementació open source d'aquests conceptes mentre treballaven en el motor de cerca Nutch. Yahoo va ser el primer gran usuari, utilitzant Hadoop per indexar la web amb un clúster de 10.000 màquines.

Avui, el 2025, l'ecosistema Hadoop ha evolucionat enormement. MapReduce ja no és l'eina de processament principal (Spark l'ha substituït àmpliament), però HDFS i YARN segueixen sent la base de moltes plataformes de Big Data on-premise. Aquesta pàgina cobreix el nucli d'Hadoop; les eines complementàries (Hive, HBase, Sqoop, Oozie, ZooKeeper) es tracten a L'ecosistema Hadoop.


HDFS: Hadoop Distributed File System

Arquitectura

HDFS és un sistema de fitxers distribuït dissenyat per emmagatzemar fitxers molt grans de forma fiable a través d'un clúster de màquines commodity (ordinadors de baix cost estàndard).

graph TB
    subgraph Client
        C[Client HDFS]
    end

    subgraph Master
        NN[NameNode\nMetadades\nEspai de noms\nDirectori de blocs]
        SN[Secondary NameNode\nCheckpoints\nNO es backup!]
        NN -.->|checkpoint periodic| SN
    end

    subgraph Workers
        DN1[DataNode 1\nBloc A1\nBloc B2\nBloc C1]
        DN2[DataNode 2\nBloc A2\nBloc B1\nBloc C3]
        DN3[DataNode 3\nBloc A3\nBloc B3\nBloc C2]
        DN4[DataNode 4\nBloc A1 rep\nBloc B2 rep]
    end

    C -->|1. On estic bloc X?| NN
    NN -->|2. DataNode 2, port 50010| C
    C -->|3. Llegir dades directament| DN2
    DN1 -.->|heartbeat cada 3s| NN
    DN2 -.->|heartbeat cada 3s| NN
    DN3 -.->|heartbeat cada 3s| NN

Components principals:

NameNode: el "cervell" del clúster HDFS. Emmagatzema tots els metadades del sistema de fitxers: l'arbre de directoris, els permisos, i la llista de blocs que formen cada fitxer i quins DataNodes els contenen. NO emmagatzema les dades reals. El NameNode és l'únic punt de fallada (SPOF) en la configuració bàsica, per la qual cosa Hadoop 2+ suporta High Availability amb dos NameNodes (actiu i de reserva).

DataNode: on es guarden físicament els blocs de dades. Cada DataNode envia un "heartbeat" al NameNode cada 3 segons per indicar que està viu. Si el NameNode no rep heartbeat durant 10 minuts, considera el DataNode mort i replica els seus blocs en altres DataNodes per mantenir el factor de replicació.

Secondary NameNode: NOM és un backup del NameNode! És un servei que periòdicament fa un checkpoint de l'estat del NameNode, fusionant el fitxer fsimage (estat del sistema de fitxers) amb el edits log (canvis recents) per evitar que el log creixi indefinidament.

Blocs i replicació

Per defecte, HDFS divideix cada fitxer en blocs de 128 MB (configurable) i emmagatzema 3 còpies de cada bloc en DataNodes diferents (factor de replicació 3). La política de placement per defecte intenta: - Posar la primera còpia al DataNode on s'escriu - La segona còpia en un rack diferent - La tercera còpia en un altre DataNode del segon rack

Això garanteix que si falla tot un rack (tall de corrent, error de switch), les dades segueixen disponibles.

Càlcul d'espai:

Espai físic necessari = Mida de les dades × Factor de replicació

Exemple:
- Dataset: 10 TB
- Factor replicació: 3
- Espai físic necessari: 10 TB × 3 = 30 TB
- Amb un 20% de marge operatiu: 36 TB

Operacions HDFS bàsiques

# Llistar el directori arrel
hdfs dfs -ls /

# Crear un directori
hdfs dfs -mkdir -p /user/alumne/dades

# Pujar un fitxer local a HDFS
hdfs dfs -put fitxer_local.csv /user/alumne/dades/

# Descarregar un fitxer d'HDFS
hdfs dfs -get /user/alumne/dades/fitxer_local.csv ./

# Veure el contingut d'un fitxer (com cat)
hdfs dfs -cat /user/alumne/dades/fitxer_local.csv | head -20

# Copiar dins HDFS
hdfs dfs -cp /user/alumne/dades/a.csv /user/alumne/backup/

# Esborrar un fitxer (va a la paperera per defecte)
hdfs dfs -rm /user/alumne/dades/fitxer_vell.csv

# Esborrar un directori i tot el seu contingut
hdfs dfs -rm -r /user/alumne/dades_velles/

# Veure l'ús de disc
hdfs dfs -du -s -h /user/alumne/

# Informació del sistema de fitxers
hdfs dfsadmin -report

# Comprovar l'estat del sistema (safe mode, blocs sub-replicats)
hdfs dfsadmin -safemode get

# Balancejar les dades entre DataNodes
hdfs balancer -threshold 10

Safe Mode

En iniciar-se, el NameNode entra en "safe mode" mentre verifica que té prou blocs reportats pels DataNodes. En safe mode, HDFS és de lectura i no permet modificacions. Si un clúster es queda en safe mode indefinidament, pot indicar un problema de DataNodes amb blocs perduts.

HDFS en alta disponibilitat

Per a entorns de producció, HDFS HA usa: - Dos NameNodes: un actiu (active) i un standby - JournalNodes: un quorum de nodes (mínim 3) que emmagatzemen el log d'edicions compartit - ZooKeeper: per a l'elecció automàtica del NameNode actiu i el failover


MapReduce: el paradigma original

MapReduce és un model de programació per al processament distribuït de grans datasets. Inspirat en les funcions funcionals map i reduce, simplifica el processament distribuït amagant tota la complexitat de la distribució, la tolerància a fallades i la gestió de la xarxa.

Com funciona

Dataset gran (TB):
[record1, record2, ..., record_N]

FASE MAP (paral·lela, un mapper per split):
Mapper 1: record1 → [(clau_A, val1), (clau_B, val2)]
Mapper 2: record2 → [(clau_A, val3), (clau_C, val4)]
Mapper N: record_N → [(clau_B, val5), (clau_C, val6)]

FASE SHUFFLE & SORT (framework automàtic):
Agrupa per clau:
clau_A → [val1, val3]
clau_B → [val2, val5]
clau_C → [val4, val6]

FASE REDUCE (un reducer per clau o grup):
Reducer 1: clau_A, [val1, val3] → resultat_A
Reducer 2: clau_B, [val2, val5] → resultat_B
Reducer 3: clau_C, [val4, val6] → resultat_C

Exemple: WordCount en Python (Hadoop Streaming)

#!/usr/bin/env python3
# mapper.py - compta les paraules d'un text

import sys

for linia in sys.stdin:
    linia = linia.strip()
    paraules = linia.split()
    for paraula in paraules:
        # Emet (paraula, 1) per a cada paraula
        print(f"{paraula.lower()}\t1")
#!/usr/bin/env python3
# reducer.py - suma les ocurrències de cada paraula

import sys

paraula_actual = None
comptador = 0

for linia in sys.stdin:
    linia = linia.strip()
    paraula, count = linia.split('\t', 1)
    count = int(count)

    if paraula == paraula_actual:
        comptador += count
    else:
        if paraula_actual is not None:
            print(f"{paraula_actual}\t{comptador}")
        paraula_actual = paraula
        comptador = count

# Emet l'última paraula
if paraula_actual:
    print(f"{paraula_actual}\t{comptador}")
# Executar el job MapReduce amb Hadoop Streaming
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \
    -input /user/alumne/text_entrada/ \
    -output /user/alumne/wordcount_resultat/ \
    -mapper mapper.py \
    -reducer reducer.py \
    -file mapper.py \
    -file reducer.py

Quan NO usar MapReduce

MapReduce té limitacions importants que el fan inadequat per a molts casos d'ús moderns:

  • Iteracions: algoritmes com k-means o PageRank requereixen múltiples passades sobre les dades. Cada iteració MapReduce escriu i llegeix d'HDFS, introduint una latència enorme.
  • Interactivitat: no és possible fer una consulta ad-hoc amb MapReduce en segons; cada job triga minuts.
  • Streaming: MapReduce és inherentment batch; no pot processar dades en temps real.
  • Complexitat de programació: expressar lògica complexa en parells Map/Reduce és laboriós.

Per a tots aquests casos, Apache Spark (que llegeix de HDFS però processa en memòria) és la solució actual.


YARN: Yet Another Resource Negotiator

YARN és el sistema de gestió de recursos d'Hadoop 2+. Desacobla la gestió de recursos del model de programació, permetent executar no només jobs MapReduce sinó qualsevol framework de computació distribuïda (Spark, Flink, Tez...).

graph TB
    subgraph YARN
        RM[ResourceManager\nGestiona recursos globals\nPlanífica aplicacions]
        NM1[NodeManager 1\nGestiona contenidors\nMonitora recursos]
        NM2[NodeManager 2\nGestiona contenidors\nMonitora recursos]
        NM3[NodeManager 3\nGestiona contenidors\nMonitora recursos]
    end

    subgraph App["Aplicacio Spark"]
        AM[ApplicationMaster\ns'executa en un contenidor\nNegoci recursos amb RM]
        E1[Executor 1]
        E2[Executor 2]
    end

    Client --> RM
    RM --> NM1
    RM --> NM2
    RM --> NM3
    NM1 --> AM
    NM2 --> E1
    NM3 --> E2
    AM -->|sol·licita contenidors| RM

Conceptes clau YARN:

  • Container: unitat de recursos assignada (CPU + memòria)
  • ApplicationMaster: un procés per aplicació que negocia els recursos amb el ResourceManager
  • NodeManager: el "daemon" que s'executa a cada worker node i gestiona els contenidors locals

Continuació

Aquest tema continua a L'ecosistema Hadoop (Hive, HBase, Sqoop, Oozie, ZooKeeper i la comparativa amb Spark/Flink), a Apache Spark per al motor de processament principal, a Apache NiFi i Apache Kafka per a la ingestió, i a Big Data al núvol per als serveis gestionats (AWS EMR, Dataproc, HDInsight, Databricks).


RA2 | Mòdul 5075 Big Data Aplicat | Institut Sa Palomera (Blanes) | Curs IABD 2026-2027