Salta el contingut

L'ecosistema Hadoop: Hive, HBase, Sqoop, Oozie, ZooKeeper

Introducció

HDFS, MapReduce i YARN formen el nucli d'Hadoop, però el que ha fet d'Hadoop una plataforma completa és l'ecosistema d'eines complementàries construïdes al seu voltant: motors SQL, bases de dades NoSQL, eines d'importació/exportació i serveis de coordinació. Aquest tema recorre les eines que encara avui es troben en clústers on-premise i que cal saber reconèixer, encara que algunes estiguin en declivi a favor d'alternatives més modernes.


Apache Hive

Hive és una capa de SQL sobre HDFS/Hadoop que permet fer consultes en SQL (HiveQL) sense programar MapReduce manualment. Tradueix automàticament les consultes SQL en jobs MapReduce o Spark (Hive on Spark).

-- Crear una taula externa sobre dades en HDFS (no copia les dades)
CREATE EXTERNAL TABLE IF NOT EXISTS logs_web (
    timestamp_event STRING,
    ip_client STRING,
    metode STRING,
    url STRING,
    codi_resposta INT,
    mida_resposta BIGINT,
    user_agent STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/alumne/logs/';

-- Crear una taula optimitzada en format Parquet amb particionament
CREATE TABLE logs_web_parquet (
    timestamp_event STRING,
    ip_client STRING,
    metode STRING,
    url STRING,
    codi_resposta INT,
    mida_resposta BIGINT
)
PARTITIONED BY (any INT, mes INT)
STORED AS PARQUET;

-- Carregar dades de la taula original a la particionada
INSERT INTO TABLE logs_web_parquet PARTITION (any=2025, mes=3)
SELECT timestamp_event, ip_client, metode, url, codi_resposta, mida_resposta
FROM logs_web
WHERE year(timestamp_event) = 2025 AND month(timestamp_event) = 3;

-- Anàlisi: top 10 URLs més visitades el 2025
SELECT url, COUNT(*) AS visites
FROM logs_web_parquet
WHERE any = 2025 AND codi_resposta = 200
GROUP BY url
ORDER BY visites DESC
LIMIT 10;

Apache HBase

HBase és una base de dades NoSQL columnar distribuïda sobre HDFS, inspirada en Google Bigtable. Les seves característiques:

  • Latència molt baixa per a lectures i escriptures aleatòries (mil·lisegons)
  • Escalabilitat horitzontal: pot gestionar trilions de files i milions de columnes
  • Consistència forta: a diferència de Cassandra, HBase garanteix consistència en cada lectura

Casos d'ús típics: historial de navegació web, feeds de xarxes socials, missatgeria, registres de trucades (CDR en telecomunicacions).

Apache Sqoop

Sqoop (SQL-to-Hadoop) és l'eina estàndard per a importar dades de bases de dades relacionals (MySQL, Oracle, PostgreSQL) a HDFS o Hive, i viceversa. Usa JDBC internament i paral·lelitza la importació.

# Importar tota una taula de MySQL a HDFS en format Parquet
sqoop import \
    --connect jdbc:mysql://servidor-mysql:3306/ecommerce \
    --username admin --password secret \
    --table comandes \
    --target-dir /user/alumne/comandes/ \
    --as-parquetfile \
    --num-mappers 8 \
    --split-by id_comanda

# Exportar dades d'HDFS a MySQL
sqoop export \
    --connect jdbc:mysql://servidor-mysql:3306/reporting \
    --username admin --password secret \
    --table resum_vendes_mensuals \
    --export-dir /user/alumne/resum_vendes/ \
    --input-fields-terminated-by ','

Sqoop el 2025

Sqoop està en mode de manteniment i no s'actualitza activament. Les alternatives modernes són Apache NiFi per a la ingestió en temps real i Kafka Connect amb connectors JDBC per a la captura de canvis (CDC) — vegeu les pàgines Apache NiFi i Apache Kafka. Per a migracions batch, moltes empreses usen directament connectors JDBC de Spark.

Apache Oozie

Oozie és el planificador de fluxos de treball (workflow scheduler) natiu de l'ecosistema Hadoop. Permet definir pipelines de jobs MapReduce, Spark i Hive com a grafs DAG en XML. El 2025, ha estat pràcticament substituït per Apache Airflow en noves implantacions (vegeu el mòdul 5074, bloc d'ETL i pipelines).

Apache ZooKeeper

ZooKeeper és un servei de coordinació distribuïda que proporciona:

  • Configuració distribuïda: emmagatzemar i distribuir configuració entre nodes del clúster
  • Naming service: descoberta de serveis en un clúster
  • Sincronització: locks distribuïts per coordinar processos concurrents
  • Elecció de líder: determinar quin node és el mestre (usat per HBase, YARN HA, i les versions clàssiques de Kafka)

graph LR
    subgraph Casos["Cas d'us"]
        B1[Batch\nHistoric gran]
        B2[Batch\nIteratiu]
        B3[Near real-time]
        B4[Real-time\nstrict]
        B5[ML distribuit]
        B6[Grafos]
    end

    subgraph Eines
        MR[MapReduce]
        SP[Spark]
        FL[Flink]
        KS[Kafka Streams]
    end

    B1 -->|adequat| MR
    B1 -->|millor opcio| SP
    B2 -->|NO adequat| MR
    B2 -->|ideal| SP
    B3 -->|Structured Streaming| SP
    B3 -->|ideal| FL
    B4 -->|NO| SP
    B4 -->|ideal latencia ms| FL
    B4 -->|simple| KS
    B5 -->|MLlib| SP
    B6 -->|GraphX| SP

Resum de la decisió:

Eina Millor per a Latència Complexitat
MapReduce ETL batch molt gran, compatibilitat legacy Minuts/hores Alta (Java)
Spark Batch, ML, streaming near-real-time Segons/minuts Mitjana (Python)
Flink Streaming real-time, event-time processing Mil·lisegons Alta (Java/Scala)
Kafka Streams Streaming simple en microserveis Java Mil·lisegons Baixa (Java)

Exercici pràctic: comandaments HDFS + Hive

Escenari

Tens accés a un clúster Hadoop Docker (o pots usar la imatge bde2020/hadoop-namenode). Has de:

  1. Preparar les dades localment:
# Descarregar dataset de vendes públic (exemple)
curl -L "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" \
    -o titanic.csv

# Iniciar el contenidor Hadoop
docker run -d --name hadoop-demo \
    -p 9870:9870 -p 8088:8088 \
    -e CLUSTER_NAME=demo \
    bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
  1. Pujar dades a HDFS:
# Entrar al contenidor
docker exec -it hadoop-demo bash

# Crear directori a HDFS
hdfs dfs -mkdir -p /user/alumne/titanic

# Pujar el CSV (suposem que l'hem copiat al contenidor)
docker cp titanic.csv hadoop-demo:/tmp/
hdfs dfs -put /tmp/titanic.csv /user/alumne/titanic/

# Verificar
hdfs dfs -ls /user/alumne/titanic/
hdfs dfs -du -h /user/alumne/titanic/
  1. Crear taula Hive i fer consultes:
-- Iniciar Hive
hive

-- Crear base de dades
CREATE DATABASE IF NOT EXISTS exercici;
USE exercici;

-- Crear taula externa sobre el CSV d'HDFS
CREATE EXTERNAL TABLE passatgers_titanic (
    PassengerId INT,
    Survived INT,
    Pclass INT,
    Name STRING,
    Sex STRING,
    Age DOUBLE,
    SibSp INT,
    Parch INT,
    Ticket STRING,
    Fare DOUBLE,
    Cabin STRING,
    Embarked STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/alumne/titanic/'
TBLPROPERTIES ("skip.header.line.count"="1");

-- Taxa de supervivència per classe i sexe
SELECT
    Pclass AS classe,
    Sex AS sexe,
    COUNT(*) AS total,
    SUM(Survived) AS supervivents,
    ROUND(SUM(Survived) * 100.0 / COUNT(*), 1) AS taxa_supervivencia
FROM passatgers_titanic
WHERE Age IS NOT NULL
GROUP BY Pclass, Sex
ORDER BY Pclass, Sex;

-- Edat mitjana dels supervivents vs no supervivents
SELECT
    CASE WHEN Survived = 1 THEN 'Supervivent' ELSE 'No supervivent' END AS estat,
    ROUND(AVG(Age), 1) AS edat_mitjana,
    ROUND(AVG(Fare), 2) AS tarifa_mitjana
FROM passatgers_titanic
WHERE Age IS NOT NULL
GROUP BY Survived;

Preguntes de reflexió:

  1. Quina diferència hi ha en el rendiment si converteixes el CSV a format Parquet i repeteixes les consultes?
  2. Quin impacte tindria augmentar el factor de replicació de 3 a 5 en aquest clúster d'un sol node?
  3. Com modificaries el disseny de la taula Hive per optimitzar les consultes per rang de dates si afegíssim una columna de data?

Consulta la pràctica Clúster Hadoop amb Docker Compose per a la pràctica completa i avaluable de Hadoop amb Docker.


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