Curso Big Data (Tema 1)
Curso Big Data (Tema 1)
1. BATCH PROCESSING
1.1. Hadoop.
1.2. Pig.
1.3. Hive.
1.4. Sqoop.
1.5. Flume.
1.6. Spark Core.
1.7. Spark 2.0.
2. STREAMING PROCESSING
2.1. Fundamentos de Streaming Processing.
2.2. Spark Streaming.
2.3. Kafka.
2.4. Pulsar y Apache Apex.
2.5. Implementación de un sistema real-time.
3. SISTEMAS NOSQL
3.1. Hbase.
3.2. Cassandra.
3.3. MongoDB.
3.4. Neo4J.
3.5. Redis. 3.6. Berkeley DB.
4. INTERACTIVE QUERY
4.1. Lucene + Solr.
6. CLOUD COMPUTING
6.1. Amazon Web Services.
6.2. Google Cloud Platform.
8. VISUALIZACIÓN DE DATOS
8.1. Herramientas de visualización: Tableau y CartoDB.
8.2. Librerías de Visualización: D3, Leaflet, Cytoscape.
1. BATCH PROCESSING
Introducción
Batch processing (Sistema por lotes en español) hace referencia a la ejecución de un programa sin control
por parte del usuario.
Normalmente se usa para realizar tareas que son repetitivas sobre grandes lotes de información.
Es normal que estos programas se ejecuten a través de scripts en los que dentro suele estar indicado que
acciones van a ser ejecutadas por dicho script y, normalmente, los recursos que va a necesitar para llevarlo a
cabo.
Script
Existen varios programas que funcionan usando batch processing, por ejemplo:
Generalmente, casi en todos los casos, un programa podría ser ejecutado en modo batch, siempre que se pueda
especificar qué pasos existen para su ejecución mediante un script.
No se debe confundir el procesamiento por lotes con los archivos que tengan extensión .bat de los sistemas batch.
Los archivos .bat se ejecutan de manera secuencial y el usuario no puede hacer nada (Interaccionar) mientras que
este se está ejecutando.
Por otro lado, tenemos los sistemas por batch que son una forma de hacer el proceso de la información en lenguaje
llano. Estos sistemas son ejecutados de forma secuencial también pero no porque el programa en sí se lo exija (Como
los archvos .bat), sino porque no conocen otra forma de ejecutarse.
Como introducción tenemos varios apartados interesantes que nos serán de ayuda para adentrarnos en profundidad.
Hadoop nace en el momento en que Google necesita urgentemente una solución con la que pueda continuar
procesando datos al ritmo que el mercado le demanda.
Pig es una plataforma creada por Yahoo que nos ayuda a desarrollar algoritmos MapReduce.
Apache sqoop es una herramienta que fue diseñada para importar información desde bases de datos estructuradas y
sistemas Hadoop en el clúster Hadoop.
Apache Spark es un framework de computación en clúster diseñado para una rápida computación.
Objetivos
Dentro de esta unidad vamos a ver varios tipos de herramientas que nos serán de ayuda para empezar a desarrollarnos
dentro del batch processing:
Mapa Conceptual
Hadoop.
¿Qué es HADOOP?
Podríamos empezar esta nueva unidad comentando que Hadoop nace en el momento en que Google necesita
urgentemente una solución con la que pueda continuar procesando datos al ritmo que el mercado le demanda ya que
Google en sus inicios creció de forma exponencial. Google decide buscar una solución y esta solución se basa en un
sistema de archivos distribuidos. Más tarde se denominará Hadoop y se basa en un gran número de pequeños
ordenadores, cada uno de los cuales se encarga de procesar una parte de la información.
Lo novedoso y la excelencia del sistema es que a pesar de que cada uno de ellos funciona de forma independiente y
autónoma, todos actúan en conjunto como si fueran un solo ordenador de dimensiones increíbles.
En 2006, Google publica todos los detalles acerca de su nuevo descubrimiento, compartiendo su conocimiento y
experiencia con todos los usuarios. Esto despierta el interés de la comunidad Open Source que viendo las nuevas
oportunidades que surgirán, explotan sus posibilidades desarrollando una implementación a la que denominan
Hadoop.
A partir de entonces son muchas las empresas que lo incorporan a sus plataformas, como ya veremos y que fomentan
y apoyan la investigación de la comunidad de Open Source.
Conceptos previos
Es necesario conocer de forma muy clara algunos conceptos antes de profundizar en Hadoop.
1. Ley de Moore: Originado en la década de los 60’s, establece que la velocidad del procesador o el poder de
procesamiento total de las computadoras se duplica cada doce meses.
2. Nodo: PC o equipo físico que posee, como tal, su propio hardware y software.
1. Rack: Es un conjunto de 1 a n nodos que se suelen aunar en estructuras metalizas y están conectados a una
misma red.
1. Clúster: Conjunto de 1 a n racks unidos entre sí por una misma red y que se comportan como un único
ordenador.
Hadoop
“The Apache™ Hadoop® project develops open‐source software for reliable, scalable, distributed computing.”
Apache Hadoop es por lo tanto un framework de software libre que permite escribir y ejecutar aplicaciones en
sistemas distribuidos para procesar grandes cantidades de datos. Está diseñado para escalar de servidores individuales
a miles de máquinas, cada una con el procesamiento y el almacenamiento local.
En lugar de confiar en el hardware para ofrecer alta disponibilidad, el framework en sí está diseñado para detectar y
controlar los errores en la capa de aplicación, facilitando un servicio de alta disponibilidad en la capa superior,
haciendo transparente al usuario la posible caída de un nodo.
El framework de Hadoop está escrito en Java y es una evolución del subproyecto Nutch que a su vez fue un
subproyecto de Lucene, todos ellos desarrollados por Doug Cutting, que nombró el proyecto en honor al elefante de
juguete de su hijo.
Lucene es un proyecto Java orientado a la búsqueda e indexación de texto. Aunque ha sido utilizado para la
implementación de motores de búsquedas ya que es capaz de procesar millones de documentos, es útil para cualquier
aplicación que requiera indexación y búsqueda de textos completos.
Nutch es una extensión de Lucene que permite construir un motor de búsquedas web, usando Lucene como su núcleo.
Es capaz de procesar miles de millones de páginas web sin llegar a tener un coste exorbitante. Otra diferencia con
Lucene, es que Nutch debe correr sobre un clúster distribuido. Para ello, se tuvo que crear una capa que permitiera
gestionar el procesamiento distribuido, la redundancia, el balanceo de carga y recuperación frente a fallos.
Java
Alrededor de 2004, Google publicó dos papers describiendo Google File System (GFS) y el framework de
MapReduce. Doug Cutting implementó una evolución del framework de Nutch basado en estas tecnologías y
rápidamente superó las capacidades de Nutch pudiendo procesar varios cientos de miles de páginas web en clusters
de docenas de nodos.
Aunque el concepto de programación distribuida está muy extendido, los puntos clave de Hadoop son por lo tanto:
1. Accesible: Hadoop se ejecuta en grandes grupos de máquinas en clústeres o en nubes tales como Amazon’s
Elastic Compute Cloud (EC2).
2. Robusto: Debido a que está pensado para funcionar con hardware de equipos básicos, Hadoop está diseñado
para trabajar pese a que se sufran frecuentes averías hardware. Gracias a ello, es capaz de manejar la mayoría
de estos fallos.
3. Escalable: Hadoop permite el escalado horizontal para gestionar volúmenes de datos más grandes mediante
la replicación, añadiendo más nodos al clúster.
4. Simple: Hadoop permite a los usuarios escribir código eficiente en paralelo empleando conceptos complejos
como MapReduce o el sistema distribuido de archivos HDFS diseñado en base al GSF de Google.
Profundizando un poco más, Hadoop es un sistema distribuido usando una arquitectura Master-Slave (maestro-
esclavo), usado para almacenar su Hadoop Distributed File System (HDFS) y algoritmos de MapReduce para hacer
cálculos.
Hadoop corre sobre Linux. Hay varias formas de utilizar Hadoop. Dependiendo de nuestras necesidades podemos
optar por varios tipos de instalación o modos de funcionamiento:
1. Un único nodo en local (single node), utilizado por ejemplo para hacer pruebas de concepto corriendo Hadoop
en una misma máquina.
2. Un clúster pseudo-distribuido para simular un clúster de varios nodos pero corriendo en una misma máquina
es decir en la misma máquina virtual Java.
3. Montar un clúster entre distintas máquinas (multi node) totalmente distribuido que sería el modo que
utilizaríamos para montar un sistema Big Data en producción.
Hadoop requiere un entorno de programación Java. Destacar que los usuarios de Linux o Mac OSX u otros entornos
Unix son capaces de instalar Hadoop y ejecutarlo en una o más maquinas sin más necesidad de software que Java. El
resto de usuarios necesitan una máquina virtual. Por esta razón es muy útil conocer y manejar los comandos Linux.
Ecosistema Hadoop
Este ecosistema cambia muy rápido con lo que es bueno revisarlo cada cierto periodo de tiempo. Aquí se muestran
los proyectos más comunes.
Ejemplo
Monitorización
Chukwa (http://chukwa.apache.org/): Es un sistema de captura de datos y framework de análisis que trabaja con
Hadoop para procesar y analizar grandes volúmenes de logs. Incluye herramientas para mostrar los datos capturados.
Flume https://flume.apache.org/: En inglés se denomina Flume a un canal de agua artificial para mover troncos (logs).
Es un sistema distribuido para agregar y mover grandes cantidades de archivos de logs de diferentes orígenes,
servidores, a un repositorio central, simplificando el proceso de recolectar estos datos para almacenarlos en Hadoop
y poder analizarlos.
Flume
La arquitectura e integración de Flume, donde se ve como diferentes agentes recogen ficheros log desde diferentes
orígenes, los integran en un repositorio común para después analizarlos con Hadoop llevándolos primero a su
sistema de archivos HDFS, se muestra en la figura siguiente:
ZooKeeper https://zookeeper.apache.org/: Proporciona una infraestructura para gestionar sistemas distribuidos y
mantener la sincronización del clúster. Facilita un conjunto de primitivas simples que pueden usar las aplicaciones
distribuidas para implementar servicios de mayor nivel de sincronización y configuración. Es fácil de programar y
usa un modelo de datos del estilo de árbol de directorios de los sistemas de archivos.
Procesamiento
MapReduce es un modelo de programación para dar soporte a la computación paralela sobre grandes colecciones de
datos en grupos de computadoras y al commodity computing. El nombre del framework está inspirado en los nombres
de dos importantes métodos, macros o funciones en programación funcional: Map y Reduce. MapReduce ha sido
adoptado mundialmente, ya que existe una implementación OpenSource denominada Hadoop.
Avro https://avro.apache.org/: La serialización es el proceso mediante el cual se convierte un objeto a un formato para
que pueda ser procesado y almacenado. Como en Hadoop se procesa una gran cantidad de datos la serialización se
usa para poder procesarlos y guardarlos de forma eficiente. La serialización puede ser en formato de texto plano,
JSON o binario. De esta forma se pueden leer datos y almacenarlos de forma fácil desde diferentes lenguajes de
programación.
Hive https://hive.apache.org/: Facilita la lectura, escritura y gestión de grandes datasets almacenados en Hadoop
usando un lenguaje similar a SQL llamado HiveQL. En el siguiente enlace se puede encontrar un manual de
uso: https://cwiki.apache.org/confluence/display/Hive/GettingStarted
Esta imagen refleja el funcionamiento de Hive que funciona como una capa externa y por encima de Hadoop y desde
donde vamos a poder realizar consultas sobre los ficheros de HDFS usando HiveQL.
HCatalog https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat.
Es un servicio para la gestión de tablas y almacenamiento que proporciona un esquema común que permite abstraerse
de las diferentes estructuras de tablas, de cómo se almacenan y de los datos que contienen, facilitando las operaciones
de lectura y escritura.
Pig https://pig.apache.org/: Desarrollado por Yahoo, permite a los usuarios de Hadoop centrarse más en el análisis de
los datos y menos en la creación de programas MapReduce proporcionando un lenguaje de alto nivel para el análisis
y ejecución de procesos en paralelo. La documentación se encuentra en http://pig.apache.org/docs/r0.16.0/index.html.
Spark http://spark.apache.org/: Es un motor de computación muy potente con un modelo de programación muy
simple que da soporte a múltiples aplicaciones.
Sqoop http://sqoop.apache.org/: /: Es una herramienta para la transferencia de grandes volúmenes de datos entre bases
de datos relacionales, Hadoop y viceversa.
Tez https://tez.apache.org/: Es una evolución del sistema MapReduce, que permite ejecutar varias operaciones Map
y/o reduce concatenadas. Estas tareas se pueden modelar en forma de grafo acíclico.
Tez
Lucene https://lucene.apache.org/core/: Es un proyecto de Apache bastante popular para realizar búsquedas sobre
textos. Proporciona librerías para la indexación y búsqueda de texto. Ha sido principalmente utilizado en la
implementación de motores de búsqueda.
Bases de datos
Módulos en Hadoop
Hadoop está inspirado en el proyecto de Google File System (Ghemawat, y otros, 2003) y en el paradigma de
programación MapReduce. Hadoop está compuesto de tres piezas fundamentales: Hadoop Distributed File System
(HDFS), Hadoop MapReduce y Hadoop Common en los que entraremos en detalle en los siguientes apartados:
Hadoop Common: Utilidades comunes que dan soporte a otras aplicaciones Hadoop.
Hadoop Distributed File System (HDFS): Sistema distribuido de ficheros que proporciona un alto rendimiento
en el acceso a datos.
Hadoop MapReduce: Sistema para el procesamiento en paralelo de grandes volúmenes de datos.
PIG
Pig es una plataforma creada por Yahoo (a alto nivel) que nos ayuda a desarrollar algoritmos MapReduce utilizando
una sintaxis similar a SQL llamada Pig latin. Tiene dos modos de funcionamiento permitiéndonos ejecutar los
algoritmos en el cluster HDFS de Hadoop o en nuestra maquina local. Utilizando un script se codificarán las sentencias
que realizan la carga, escaneo, búsqueda y filtrado de los datos de entrada y sentencias para el formateo y
almacenamiento de los datos de salida.
Podremos utilizar un schema para estructurarlos y poder acceder de manera más sencilla.
Se puede ampliar Pig Latin usando UDF (Funciones definidas por el usuario).
Estas funciones pueden estar desarrolladas en varios lenguajes de programación (Python, Ruby, Java, Javascript,...) y
luego llamarlas, de forma directa, desde el propio lenguaje.
Inicialmente Pig se desarrolló en 2006 por los investigadores de Yahoo Research para poder lanzar un map-reduce
sobre un gran volumen de datos.
Para poder comprender mejor el por qué se creó Pig, se definieron una lista de enunciados que resumen el proyecto.
1. "Pigs eat anything": Haciendo referencia al símil de que un cerdo puede comer cualquier cosa, Pig puede
trabajar con cualquier tipo de datos, ya sea no estructurado, estructurado ó semi-estructurado.
2. "Pigs live anywhere": En su creación, Pig fue implementado en Hadoop pero esto no significa que solamente
esté orientado a esta plataforma. Su intención es que Pig sea utilizado como un lenguaje para el procesamiento
paralelo.
3. "Pigs are domestic animals": Al igual que los "animales domésticos", Pig está pensado para que los propios
usuarios puedan controlar y modificar el funcionamiento (conducta en el caso de los animales domésticos) de
los programas. Como indicamos en el apartado anterior, Pig puede crecer y aumentar su funcionalidad
mediante funciones que definan los propios usuarios (UDF). Esto hace que Pig pueda extenderse mediante
UDFs para que realice un procesamiento personalizado.
4. "Pigs fly": El objetivo de Pig es procesar datos de forma muy rápida. No pretendemos mejorar las
características sino el rendimiento para que realmente Pig pueda "volar".
Por supuesto, al ser el creador de dicha plataforma, Yahoo! fue el primero en utilizarla para sus procesos de búsqueda
en la web así como para incorporarlo en Hadoop.
Realmente, más del 50% de los procesos que se ejecutan en Hadoop se basan en scripts escritos en Pig Latin.
A partir del 2009, Pig se empezó a usar para el procesamiento de datos en otras compañías, tales como:
Linkedin: Esta plataforma usa Hadoop y Pig en el componente “Gente que podrías conocer” para recomendar
a los usuarios posibles conocidos, empleos o páginas que puedan ser de su interés.
Twitter: Esta red social usa Pig para procesar logs de datos de los tweets enviados.
AOL y WhitePages: Estas páginas utilizan Pig para, en sus búsquedas de información, filtrar los registros.
Pig Latin
Pig Latin es un lenguaje de programación que usa flujos de datos de forma paralela. Esto permite a los
programadores definir cómo deben ser tratados (Lectura, Procesamiento y Almacenamiento) los datos que provienen
de una o más entradas.
La sintaxis es muy parecida a SQL pero, al ser un lenguaje orientado a la transformación de datos también es parecido
a los optimizadores de consultas.
Habitualmente utilizando MapReduce en Java, los programas pueden ser de más de 100 líneas de código, mientras
que utilizando Pig Latin, los scripts normalmente no suelen pasar de unas 10 líneas de código.
Pig Latin
El método de funcionamiento de Pig Latin es el de ejecutar sentencias tomando los datos de entrada ("bag") que hacen
referencia a un conjunto de tuplas (filas), procesando dichas sentencias con dichas tuplas y emitiendo otro "bag" como
salida.
Una "tupla" es un conjunto de campos, donde cada uno hace referencia a cualquier tipo de dato. Pig Latin no utiliza
condicionales tales como "if" ni tampoco ciclos tales como "for" ya que este lenguaje está enfocado en el flujo de
datos y no en controlar dicho flujo como otros lenguajes de programación.
Pig Latin usa operadores relacionales para poder realizar varias operaciones sobre los datos que se analizan.
Aunque anteriormente hemos dicho que Pig Latin no utiliza ciclos "for", sí que existe el operador "FOREACH" que
tiene una naturaleza similar ya que su función es la de iterar sobre las tuplas y transformarlas en dichas iteraciones.
En la siguiente tabla se puede observar algunos de los operadores relacionales que son utilizados en Pig Latin:
Operadores relacionales Pig Latin
Anteriormente comentamos el uso que algunas empresas (LinkedIn, Twitter, AOL,...) le daban a Pig.
Además de estos usos, existen muchos datos que se pueden procesar y aún no se ha hecho y esto puede permitir
realizar modelos de predicción del comportamiento.
Por ejemplo, Pig se podría usar para ver todos los movimientos de un usuario en una página web y poder dividir en
varios tipos a los usuarios. Así, se podría categorizar a dichos tipos de usuarios y para cada uno mostrar anuncios o
artículos que estén más relacionados con sus tipos de búsqueda.
Pig permite el análisis de gran volumen de información (Big Data), con Apache Pig se puede procesar y almacenar
dichos datos en una base de datos y posteriormente ejecutar consultas (queries) sobre ellos. Esto hace que Pig tenga
una similitud con una herramienta ETL (Extract Transform Load).
Pig permite la paralelización utilizando Hadoop haciendo que los scripts sean más simples.
Esto no significa que Pig sea un reemplazo de una ETL ya que no tiene funcionalidades específicas como sí lo hace
una herramienta ETL.
Este ejemplo de un archivo cogerá las palabras de un archivo de texto y nos contará las palabras.
HIVE
Apache Hive es un framework que fue originalmente creado por Facebook que sirve para trabajar con el HDFS de
Hadoop y nos facilita trabajar con los datos. A través de sentencias SQL podemos lanzar consultas que serán
traducidas a trabajos MapReduce.
Facebook fue la encargada de desarrollar Hive y actualmente es utilizada por Apache Hive y desarrollada por
empresas tales como Netflix y FINRA (Financial Industry Regulatory Authority).
Amazon incluye una derivación Apache Hive en sus servicios Amazon Web Services.
Hive no es una base de datos, aunque tengamos que crearnos un schema, crear una tabla e introducir datos. Por esto
se conoce como el componente datawarehouse de Hadoop.
Apache Hive permite analizar conjuntos de datos grandes que utilicen almacenamiento bajo HDFS de Hadoop y en
sistemas que sean compatibles tales como Amazon S3.
Tiene un lenguaje basado en SQL que se llama HiveQL y permite leer y convertir consultas en MapReduce y otras
plataformas que pueden ejecutarse bajo YARN.
Para que las consultas sean más rápidas, Hive utiliza índices de bitmaps.
Inicialmente, Hive guarda sus metadatos en una base de datos apache Derby pero se puede configurar para que estos
metadatos puedan ser almacenados en otros bases de datos relacionales como pueden ser: Postgres, MySQL, Oracle,
o MS SQL.
Su principal inconveniente es que necesita procesar la consulta SQL y traducirla a Java para crear el trabajo
MapReduce.
Desde el botón upload podemos subir archivos que utilizaremos como fuentes de datos:
Para procesar los datos utilizaremos el editor que tiene integrado:
Crearemos la base de datos y la tabla que almacenara los datos desde aquí.
Supongamos que hemos creado una tabla como esta. Los campos de la tabla deben de ser campos que tengamos en
nuestro archivo de datos
from presupuestos
order by importe
Conclusión
Hive nos proporciona una herramienta para traducir queries del lenguaje tradicional SQL, que es ya conocido por la
industria, a los nuevos frameworks NoSQL en el ecosistema Hadoop. Hive es una herramienta fácil y rápida de
programar pero conlleva un sobrecoste en la ejecución en comparación de la programación directa en frameworks
NoSQL.
Si se utiliza un volumen de información muy extenso en un clúster de Hadoop y no se tienen nociones o fundamentos
para programar MapReduce, Hive es perfecta para poder extraer la información que se desee.
Por ejemplo:
Si tenemos muchos archivos .log en un servidor y queremos extraer información en ellos sería difícil poder extraer
información de forma fácil y rápida. Sin embargo, utilizando Hive, sería sencillo crear una tabla extrayendo los datos
de los ficheros y filtrando la información por ejemplo por líneas que contengan fallos o errores.
SQOOP
Sqoop es un programa que se ejecuta bajo línea de comandos y sirve para transferir datos entre Hadoop y BD
relacionales.
El nombre de esta aplicación surge de unir las palabras sql y hadoop. Pasó a ser un proyecto Apache de nivel superior
en 2012. Tiene una amplia documentación tanto para desarrolladores como para usuarios.
Como ejemplo, Microsoft usa un conector que está basado en Sqoop para ayudar al traspaso de información entre
SQL Server y Hadoop.
La API de Sqoop permite conectar con otras BD mediante el desarrollo de conectores y así poder adaptar y usar los
lenguajes de consultas de otro proveedor de BD específico.
Sqoop trabaja como una capa intermedia entre las BD relacionales y Haddop tal y como se muestra en la siguiente
imagen.
Funcionamiento Sqoop
Apache Sqoop es una herramienta que fue diseñada para importar información desde bases de datos estructuradas
y sistemas Hadoop en el clúster Hadoop. Podemos utilizar Sqoop también para extraer datos Hadoop y exportarlos a
bases de datos relacionales
Una vez ejecutado tendremos nuestra tabla importada en el HDFS de hadoop listo para ser usado.
Conclusión
Como hemos podido ver, Sqoop es una herramienta muy útil para trasladar una base de datos ya existente al entorno
Hadoop y viceversa.
Nos permite, mediante los comandos pertinentes, importar datos de nuestra BD relacional, analizarlos y gestionarlos
mediante otras herramientas como pueden ser Pig o Hive sobre Hadoop y devolver el resultado de nuevo a nuestras
BD relacionales.
Almacenamiento de datos
FLUME
Flume es un servicio distribuido y fiable para recoger, agregar y mover grandes cantidades de datos de log. Tiene
una arquitectura simple y flexible de flujo de datos. Es robusto y tolerante a fallos con mecanismo de confiabilidad
ajustables y muchos mecanismos de conmutación por error y recuperación. Utiliza un modelo de datos extensible que
permite la aplicación analítica en línea. Esta principalmente diseñado para copiar datos de varios servidores a HDFS.
Para usar Flume una vez lo tengamos instalado configuraremos de dónde obtendremos los datos:
Vamos a transferir los datos de twitter. Una vez listado los componentes, tendremos que describirlos:
Ahora deberemos describir los “sink” que será donde almacenemos los datos:
Así configuraremos los sink para HDFS.
Deberemos describir el canal por donde se transferirá los datos entre la fuente de datos y los “sink”:
Una vez configurado como hemos visto necesitaremos un accessToken que podemos crearlo desde aps.twitter.com
una vez creada nuestra aplicación rellenaremos los datos que nos faltaban y podremos empezar a recoger datos.
Ejemplo
Ejecutaremos Flume:
1. Evento
Payload de bytes que Flume representa como unidad de datos y puede ser transportado desde el origen hacia un punto
de destino final.
2. Flujo
Movimiento entre punto de origen y destino final de los eventos.
3. Cliente
Implementación que trabaja en el origen de los eventos y realiza la entrega a un agente Flume. Ej: Log4J appender.
4. Agente
Proceso que tiene los componentes Flume como Fuentes (Source), Canales (Channels) y Sumideros (Sink). Es capaz
de obtener, guardar y reenviar eventos al siguiente destino.
1. Fuente (Source)
Implementación que es capaz de consumir eventos que se le entregan a través de un mecanismo. La fuente, al recibir
un evento, lo entrega a 1 o más canales.
2. Canal (Channel)
Es donde, temporalmente, un evento es almacenado. Estos eventos son entregados a los canales por las fuentes que
operan con el agente. Los eventos que están en los canales permanecen hasta que son eliminados por un sumidero
(Sink).
3. Sumidero (Sink)
Implementación que es capaz de eliminar eventos de un canal y enviarlos al siguiente agente del flujo o hasta el
destino final. Si el sumidero envía el evento hasta el destino final se conoce como sumidero terminal.
La relación de estos conceptos puede verse reflejada en la siguiente imagen:
Spark Core.
Apache Spark es un framework de computación en cluster diseñado para una rápida computación. Fue creada sobre
Hadoop MapReduce y amplia el modelo MapReduce para usar de manera más eficiente más tipos de cálculos que
incluyen consultas interactivas y procesamiento de flujo.
Fue desarrollada por la Universidad de California. Posteriormente, el código base fue donado a la Apache Software
Foundation que, desde entonces, se encarga de mantener dicho código. Permite una interfaz para programación de
clusters con paralelismo de datos y tolerancia a fallos.
La base de la arquitectura para Apache Spark está en el Resilient Distributed DataSet (RDD) que es un multiset de
ítems de datos, en modo solo lectura, distribuidos en un clúster de máquinas con un entorno tolerante a fallos.
Como veremos en el apartado del tema siguiente (Spark 2.0), actualmente se recomienda para el desarrollo la API
DataSet, aunque la API RDD no está descatalogada.
Los RDDs de Spark son un conjunto de trabajo (Working Set) para los programas distribuidos que permiten la
restricción de la memoria compartida distribuida.
Por otro lado, para el almacenamiento distribuido, existen varias interfaces disponibles:
Componentes Spark
Spark está basado en un núcleo o componente principal (Core) y sobre este Core hay varios componentes que
extienden su funcionalidad tales como:
1. Spark SQL: Los datos están estructurados y podemos acceder a ellos e integrar Spark con Hive, JDBC,
ODBC y herramientas de BI.
2. Spark Streaming: Soporta el procesamiento de un sistema de empaquetamiento de pequeños lotes
casi a tiempo real.
3. Spark GraphX: API para la computación de grafos de forma paralela.
4. Spark MLlib: Biblioteca donde están alojados algoritmos clásicos de machine learning que están
listos para ser ejecutados sobre Spark.
Componentes Spark
Abstracción RDD
Un RDD (Resilient Distributed Dataset) es una abstracción de Spark que hace referencia a una colección de
elementos en memoria a través del cluster en particiones. Se pueden llevar a cabo operaciones en paralelo sobre un
RDD.
Cada partición hace referencia a un subconjunto de los datos y se asigna a cada nodo para que, paralelamente, pueda
utilizar estos datos y operar con ellos.
Transmisión de datos
Vamos a crear un contador de palabras con Spark.
Primero tenemos que leer el archivo de entrada. El siguiente comando es utilizado para leer un archivo de una
localización dada.
Nuestro objetivo es contar las palabras de un archivo. Crearemos un mapa plano separando cada línea en palabras
flatMap(line ⇒ line.split(“”) después rellenaremos cada palabra como una clave con el valor 1 usando la función
map. Finalmente reduciremos esas claves añadiendo valores de claves similares. El siguiente comando es usado para
ejecutar la lógica de cuenta de palabras:
scala> val counts = inputfile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_);
Después de ejecutar el comando no tendremos ninguna salida ya que esto no es una acción sino una transformación.
scala> counts.saveAsTextFile("output”)
Para ver la salida nos iremos a ese directorio y veremos que nos ha creado 3 archivos.
Conclusion
Spark, desde sus inicios, fue diseñado y desarrollado para poner solución a muchos problemas que Hadoop
representaba. Es rápido y eficaz.
Big data
Spark 2.0.
Mejora de la velocidad
Una de las ventajas esenciales de Apache Spark 2.0 frente a sus versiones anteriores reside en la velocidad, ya que,
en esta nueva versión se utiliza una memoria caché integrada y se ha avanzado en la generación de código en tiempo
de ejecución.
La estimación de mejora de la velocidad de Apache Spark 2.0 frente a Apache Spark 1.0 y sus versiones sucesivas es
de entre 5 y 10 veces mayor.
Las APIs se unifican en una única API
La comunidad de desarrolladores reclamaban a los administradores que dieran un salto y permitieran, además de
procesar los datos en tiempo real, que se pudiera combinar este procesamiento con otro tipo de análisis de información.
En esta versión 2.0 de Spark, escuchando a los desarrolladores, está disponible una API que permite a los
programadores el desarrollo de aplicaciones que mezclen componentes en tiempo real, interactivos y por lotes.
Para poder trabajar con esta API de Spark 2.0 es necesario que se configure un almacén de datos con funciones ETL.
Gracias a ellos, se podrá analizar los sitios web mediante consultas interactivas de una sesión determinada.
En esta versión, quedan unificadas en una única biblioteca las APIs DataFrame y Datasets.
Spark 2.0 es 10 veces más rápido que Spark 1.6, en gran parte porque los desarrolladores han hecho una limpieza
bastante grande de tareas que son prescindibles.
Según los análisis realizados, se estima que la mayoría de los ciclos de un motor de datos se suele gastar en trabajos
que no sirven para nada. Optimizar estos ciclos de CPU es un paso muy importante para la mejora de la velocidad.
Spark 2.0 está basado en la segunda generación del motor de datos Tungsteno, que se acerca mucho a un compilador.
Aprovecha los registros para la escritura de datos de forma intermedia y eliminan llamar a funciones virtuales.
Recuerda
AUTOEVALUACIÓN









