---
# System prepended metadata

title: Big Data Curso
tags: [Big Data y Apache Hadoop]

---

---
tags: Big Data y Apache Hadoop
---
# Big Data Curso
---
Datos Ángel García -- PUE
Administrador PUE del Curso
https://www.cloudera.com/developers/academic-partnership.html angel.garcia@pue.es

---
Laboratorios pue.es
Es un puente entre escritorio y html: 
[guacamole](https://guacamole.apache.org/) La caña!
Guacamole 
Navegador <==> Guacamole <==> VNC / Linux 
Navegador <==> Guacamole <==> RDP / Windows 

---
==Documentación del curso==
:speaker: 
https://bit.ly/2DdHmlF 

[Apuntes - Presentación](https://drive.google.com/drive/folders/1Lt-rOwte5r9VvgCphfsABIDyAykm2YSX?usp=sharing)

[Documentación Cloudera](https://docs.cloudera.com/documentation/enterprise/5-13-x.html)



---
(1er día)
# Intro
- ++Presentación:++ Introducción Big Data
  - Muchos datos: IoT, Pb/s (petabits por segundo) (Peta 10^15^)
  - Hay que almacenarlos y procesar en un tiempo razonable
  - Muchas máquinas cooperando tanto en el almacenamiento como en el procesamiento
 - ++Historia++
   -    90's --> Yahoo, Altavista, buscadores con un servidor central 
   -    ==Llega Google== --> Con un servidor NO hacemos nada. Deciden montar servidores con máquinas simples --> Trabajar en parelelo --> Sistema de ficheros distribuido : Google file system GFS!!!! 
   -    Google inventa Map / Reduce  --> Algoritmos fácilmente paralelizable
   -    Google inventa Big Table --> Más rápido que SQL
   -    Van montando el buscador --> Es escalable!!! Cada máquina aporta discos y capacidad de proceso.  
   -    ==Replicar Google== --> Gente busca funcionalidades como la Google. Google empieza a publicar GFS y Map/Reduce --> Aparece ==Hadoop== Software libre --> Entran empresas (Yahoo--> compra)
   -    Facebook adopta hadoop (2005)
   -    Cloudera simplifica hadoop y da soporte (igual que linux). Es decir, crearon un producto basado en Hadoop
   -    Otras hacen lo mismo: MapR, Horton Works --> Distribuciones de Hadoop (software libre GPL --> Las empresas siguen aportando en Hadoop)
   -    ==soluciones cloud== AWS, Google Cloud, Azure etc --> soluciones que permiten crecer en un momento dado: on premise (en casa del cliente) vs cloud vs mixtas
   -    Soluciones cloud realmente se basan en Hadoop
   -    2019: Cloudera y Horton Works se fusionan --> Defenderse de Cloud
   -    NOTA: S3 de amazon es también big data y no se basa en HDFS (Hadoop se basa en HDFS) y puede haber otros tipos de almacenamientos (Mongo, Google Cloud Storage)
- ++¿Por qué utilizar Hadoop?++
  - Componentes:
    - Almacenamiento: HDFS
    - Yarn (proceso): Map/Reduce or Spark
    - Suele haber muchos otros servicios (ecosistema)
  - Cluster distribuido
  - Los datos se guardan cerca de donde se procesan: cuando llegan datos se dividen en trozos, se envían a las máquinas. 1 máquina - 1 trozo --> El cluster se encarga. 
  - No hay cuellos de botella: los elementos trabajan de forma independiente. Por tanto: debe haber algún nodo master y algún nodo slave
  - Hay un factor de replicación: se replican los "trozos" de datos. --> Lo mismo se recupera de un proceso
  - Para programar: definir cómo se mapea, cómo se reduce --> el resto lo hace el clúster. NOTA: no sirve para todo ¿sé cómo mapear?
  - Ejemplos donde Hadoop NO mola:
    - ray tracing (efectos especiales) --> hay soluciones mejores que hadoop: sistemas paralelos (cada cluster calcula la escena)
    - Folding at home -- proyectos: aportas tiempo de CPU
    - Seti@home -- proyecto de procesado paralelo distribuido
  - ==HADOOP viene bien cuando tenemos muchos datos==

++Montando Hadoop++
 - Nodos maestro --> mejores máquinas: dos fuentes de alimentación, dos interfaces redes, discos fiables (mayores redundancias)
 - Nodos workers --> estas  tendrán más CPU (commodity hardware (no es necesario grandes máquinas)). No gastar hardware de calidad sino mucho hardware
 - ¿Dónde invertir? Siempre invertir en cantidad que en calidad. Nunca en hardware especializado. No merece la pena gastar en SSD. Mejor discos pequeñas (cuantos más elementos más grados de paralelización)
 - Todas las máquinas lo más parecidas posibles: Kickstart, Cobbler, Clonezilla, Fog
 - Otras herramientas: chef, ansible, pupple, saltstack...
 - Hadoop solo funciona sobre linux

---
:speaker: 
https://bit.ly/2DdHmlF 

---

# 2º Día
Para hoy: Cloudera Manager, HDFS, y si da tiempo comenzamos con M&R y YARN 
==Yo voy haciendo en mi máquina lo que él hace:==

![](https://i.imgur.com/m6FIeFJ.png)

![](https://i.imgur.com/sAqHRrp.png)

* Vamos instalando algunas cosas:

![](https://i.imgur.com/4Wnt3bc.png)
![](https://i.imgur.com/etcYSko.png)

* Instalo: 
```
sudo yum install telnet links htop 
```
* Monitorizo con htop
![](https://i.imgur.com/BOSMD1m.png)

---

* Cloudera:
Cloudera Express (gratuito sin algunas funcionalidades interesantes), Cloudera Enterprise (pago), Cloudera Enterprise Trial (prueba de 60 días <-- Esto es lo que normalmente se utiliza en educación) 
 
     * Para activar Cloudera tengo algo en el escritorio (se trata de una máquina proporcionada por cloudera):
 ![](https://i.imgur.com/H9hmlh7.png)

* Lanzo Cloudera (doble click). Al cabo de un rato:
 ![](https://i.imgur.com/pqlI9RQ.png)

:warning: Es una máquina con 16G de Mem y 4 cores

* Este paso ya no será necesario próximos días --> La máquina tardará más en arrancar

* NOTA: Este cluster consta de un solo NODO

* Accedemos por navegador
![](https://i.imgur.com/1qNNKDi.png)

http://quickstart.cloudera:7180 
User: cloudera
Pass: cloudera

![](https://i.imgur.com/iBqR5LF.png)

---
NOTA: duda
```
lsof -nPi | grep LISTEN --> Puertos a la escucha
sudo service cloudera-scm-server restart --> reiniciar el servicio
otros comandos: pgrep, pkill
otro: sudo jps | awk {print $1} | xargs sudo kill
```

* ¿Qué tenemos en cloudera manager *dashboard*? (Recuerda: cloudera es una versión comercial del clúster de  Hadoop)
  * Nodo:
  ![](https://i.imgur.com/capLSek.png)
  * Servicios del nodo
  ![](https://i.imgur.com/THYCyFJ.png)
  * Número de equipos:
  ![](https://i.imgur.com/X3FReXT.png)
  * Estadísticas:
  ![](https://i.imgur.com/Mpt7IRN.png)
  * Avisos de configuración
  ![](https://i.imgur.com/i8n6fa3.png)
  * Un servicio que la plataforma cloudera manager destaca:
  ![](https://i.imgur.com/0lfOVqm.png)
* Paseo. 
  * Vemos hosts:
  ![](https://i.imgur.com/t1oZGP2.png)
  * Aquí vemos todos los roles (servicios) que hay instalados en los hosts
  ![](https://i.imgur.com/Gq9T2ER.png)
  * NOTA: host y nodo son equivalentes
  * Los roles se distribuyen en función de lo yo quiera y de las máquinas. (Recordad: rol worker en máquinas más poderosas y rol master)
  * Roles:
  ![](https://i.imgur.com/xqCFtAs.png)
  * Ejecutamos HDFS --> servicio encargado de arrancar
  ![](https://i.imgur.com/TzHRL9f.png)
  ![](https://i.imgur.com/us75ess.png)
  * Arrancamos también YARN. Diremos: "El servicio YARN se compone de varios roles"
  ![](https://i.imgur.com/fo7SCl0.png)
  * Podemos ver los últimos comando en:
  ![](https://i.imgur.com/EzgXyBt.png)
  * En cada servicio tenemos su propio panel:
  ![](https://i.imgur.com/YXHgP3J.png)
  * Cada panel tiene menús comunes. Por ejemplo, instancias de YARN:
  ![](https://i.imgur.com/l8ZcEHq.png)
  * Aquí puedes "intuir" qué nodos son workers (NodeManager), el master (Server) y auxiliares
---
Demo que estamos utilizando:
NOTA: https://downloads.cloudera.com/demo_vm/virtualbox/cloudera-quickstart-vm-5.13.0-0-virtualbox.zip

Esta máquina necesita por lo menos 10G para funcionar de Mem

---

## HDFS
* Rollazo teórico mirar apuntes
  * Escalabilidad
  * Tamaños de ficheros. Está pensado para ficheros de 128M (linux está pensado para ficheros de 4k) NOTA: supongo que hablamos de tamaño de bloque
  * Mejor pocos ficheros muy grandes
  * Master: Instancia NameNode
  * Alta disponibilidad: tienes varios master
  * Worker: Instancia o Role Datanode
  ![](https://i.imgur.com/Lht62UP.png)
  * Replicación: se guarda el dato por triblicado
  * Replication Factory y Block size --> parámetros importantes
  * Cambiamos la configuración
  ![](https://i.imgur.com/nQ25hmB.png)
  * Aparecen dos iconos:
  ![](https://i.imgur.com/tT10OWH.png)
  * Estos iconos indican que hay dos cambios pendientes: distribución de los cambios (propagar cambios) y que requiere reiniciar el servicio
  * Si clico en cualquiera de los dos iconos aparece:
  ![](https://i.imgur.com/smavQFa.png)
  * Indica todos los cambios que se deben realizar en los archivos de cambios
  * Como se escribe:
  ![](https://i.imgur.com/CPabKnA.png)
  * El cliente (programa) le pide al master ¿dónde escribo un bloque de datos (128Mb)? El master le dice: en 2, 5, 6. Cliente escribirá en 2. El nodo 2 escribirá en 5 y 5 escribirá en 6. 
  * Destaca que NameNode "casi no trabaja" lleva un control de qué ficheros hay y dónde están sus bloques. --> No hay cuello de botella (share nothing)
  * Cuando alguien va a leer le dice a NameNode: "Dime dónde está el fichero con el índice x" Y NameNode le dice "está aquí y allí"
  * Por eso para reducir el trabajo de NameNode y reducir el uso :
    * Mejor pocos ficheros
    * Mejor blocques grandes (reducir entradas)
  * Deshacemos los cambios:
  ![](https://i.imgur.com/UD6mI7q.png)
  * Clico en Details y hacemos "revert" para revertir los cambios.

# 3º Día
## Encender máquinas
* Yo tengo problemas. Hago un restart
* Comenta diferencias entre Cloudera con licencia Enterprise y la Trial. Por ejemplo:
  * Trial no dispone de rolling start
  * No puedo asignarles un nombre a los cambios
## Comandos HDFS
`$hdfs dfs -ls /` --> listado de ficheros en raíz
![](https://i.imgur.com/XrAftSr.png)
![](https://i.imgur.com/jYikstj.png)
* ¿Cuál es mi home? También creo un directorio:
![](https://i.imgur.com/zmvryxf.png)
* También de forma abreviada
![](https://i.imgur.com/ByhxkPs.png)
![](https://i.imgur.com/U98iyt3.png)
* ¿Qué pasa aquí?
![](https://i.imgur.com/hcGS4Ex.png)
--> sudo no tiene permisos. Necesitas al administrador de hdfs. ¿Quién es? ==hdfs==
* Si queremos ejecutar con el usuario hdfs:
![](https://i.imgur.com/9Yfu8Sg.png)

---

++Apache Ambari++: interfaz gráfica de Hadoop (alternativa a cloudera)
Mirar documentación del profe

---
* Ejercicios hdfs
![](https://i.imgur.com/WqJaIBD.png)
 
 No dan ningún problema
 * También podemos hacer todo esto desde:
 ![](https://i.imgur.com/RdZJmrh.png)
* Hay un componente propio de Hadoo (lo genera el NameNode) Lo tienen todos los clústeres de Hadoop
![](https://i.imgur.com/9AwNn7g.png)
* Tiene una utilidad para ver directorios
![](https://i.imgur.com/yo3mfIm.png)

* También tenemos otras GUI. Por ejemplo, Hue:
![](https://i.imgur.com/pk4trmu.png)
* Activamos el servicio Hue y nos vamos a su panel y de allí al portal
![](https://i.imgur.com/u7jXeJH.png)
 * Entramos con cloudera/cloudera (comenta que el primer usuario se convierte en admin)
 * Esto es la interfaz final; la que verá el usuario final
 ![](https://i.imgur.com/FljJ2jY.png)
 * Hay en Hue un navegador de ficheros:
 ![](https://i.imgur.com/vjDRKzL.png)
 ![](https://i.imgur.com/3hmT0Er.png)
 * Se puede interactuar con HDFS mediante API REST: hay dos escuchando (uno en el puerto 50070 y otro más moderno 14000)
 ![](https://i.imgur.com/VckoNhp.png)


---

Mirar cliente REST de una extensión de Chrome!

---
* Para que funcione tenemos que asignar la funcionalida webfds
  * Mirar que el servicio está activado en la configuración
  ![](https://i.imgur.com/YcGFmzl.png)
  * Añadimos el Role nuevo. Clicamos "Add Role Instances":
![](https://i.imgur.com/0wTpJFK.png)
![](https://i.imgur.com/h3Vd6vf.png)


![](https://i.imgur.com/LkFXfIl.png)
![](https://i.imgur.com/nruRvFo.png)
* Si miramos las instancias en HDFS vemos que tenemos un role más:
![](https://i.imgur.com/towbpk5.png)


* ¿Qué pasa cuando perdemos un nodo? --> Datos perdidos (pero están replicados) --> Hay que realizar una tercera réplica ya que ahora solo tenemos 2 réplicas --> NameNode decide dónde  

* Rebalanceo: cuando añadimos nodos hay que rebalancear
![](https://i.imgur.com/QiaKlqa.png)
* ¿Qué pasa con los ficheros corruptos? ++Bit-rot++
  * Cada vez que se guarda un bloque se guarda un CRC de "confianza"
  * Cada tres semanas o así (parámetros) se revisas todos los CRC
* Le podemos decir a HDFS cómo están distribuidos los nodos ++Rack-aware++. Es decir, la topologia física
  * Distribuye datos en localizaciones distintas. Así copio un bloque en un rack y la réplica en otro rack (ojo! A mayor distribución menor velocidad)

## YARN
* Es un planificador de tareas
* Busca aprovechar bien los recursos
* Evita sobresuscripción: que no haya intercambios constantes con swap
* Roles:
  * Master: resource manager --> Reparte el trabajo entre máquinas
  * Application Master --> El que se pone en contacto con los workers. Se encarga de la ejecución
* Ejercicio: lanzar una tarea: contar número palabras
[Programa](https://github.com/caizkun/mapreduce-examples/blob/master/WordCount/src/main/java/WordCount.java)
* Map/reduce: fases: Map, Reduce, Shuffle, Sort 
  * Map: voy leyendo palabras. Se generan pares clave-valor --> palabra-NumDevecesQueAparece Ejemplo: [hola,1], [tonto,1], [hola, 1]
  ```
  String[] words = value.toString().trim().split("\\s+");

            // output (word, 1)
            for (String word : words) {
                context.write(new Text(word), new IntWritable(1));
            }
   ```
            
  * Reduce: recibe pares. Agrupa cada clave con sus valores. Ejemplo: (hola, [1,1]), (tonto,[1])
```
for (IntWritable value : values) {
                sum += value.get();
         }
  ```

* Programador: 
  * cómo voy a definir el mapeo
  * como voy definir la reducción.




