Computación distribuida

Qué es y cómo funciona la computación distribuida

La computación distribuida es un modelo computacional diseñado para resolver problemas utilizando un gran número de ordenadores organizados en una red de telecomunicaciones.

La computación distribuida hace referencia a un modelo computacional, y también al uso de sistemas distribuidos, y las tecnologías que eso conlleva, para resolver problemas computacionales. En computación distribuida cada problema es dividido en muchas tareas, cada una de las cuales son resueltas por uno o más ordenadores que se comunican mediante un intercambio de mensajes. A continuación vamos a explicar los fundamentos de la informática distribuida y a analizar sus importantes aplicaciones, como pueden ser internet y el big data.

Modelo de computación distribuida

Un modelo de computación describe cómo un sistema calcula y genera el resultado de una función matemática tras recibir unos datos de entrada. En el caso del modelo de computación distribuida, estas operaciones son realizadas por un grupos de máquinas que colaboran juntas. El grupo de ordenadores comparten recursos, de tal forma que el conjunto es visto por el usuario como un único ordenador, más potente que cualquiera de las máquinas que lo componen. A estos grupos de ordenadores se les llaman clúster, y a cada una de las máquinas que lo componen nodos.

¿Entonces, conectando unos cuantos ordenadores tengo un clúster?

Para que un clúster funcione como tal, no basta con conectar entre sí los ordenadores, sino que es necesario proveer un sistema operativo del clúster. Este sistema de control o manejo del clúster se encarga de interactuar con el usuario y los procesos que corren en él para optimizar el funcionamiento.

A diferencia de la computacion en malla, los clústeres de computadoras tienen a cada nodo realizando la misma tarea, controlada y planificada por software.

 

Ventajas y desventajas de la computación distribuida

Esta forma de resolver los problemas resulta mucho más económica que la de hacer una máquina tan potente como sea necesario para resolver un problema. Además, los cluster aportan una gran mejora en el rendimiento o disponibilidad si lo comparamos con solo una máquina. Como se suele decir, la unión hace la fuerza.

Por el contrario, entre las desventajas tenemos que estos sistemas son más complejos y requieren de más conocimientos para configurarlos, mantenerlos y trabajar con ellos.

 

Características de los sistemas distribuidos

Los clústeres son usualmente empleados para mejorar el rendimiento o la disponibilidad por encima de la que es provista por una sola máquina, típicamente siendo más económico que computadores individuales de rapidez y disponibilidad comparables. La construcción de los ordenadores del clúster es más fácil y económica debido a su flexibilidad.

De un clúster se espera que presente combinaciones de los siguientes servicios:

  1. Alto rendimiento
  2. Alta disponibilidad
  3. Balanceo de carga
  4. Escalabilidad
 

Sistema distribuido

Un sistema distribuido es un sistema cuyos componentes están ubicados en distintos ordenadores interconectados, y que se comunican y coordinan sus acciones mediante el intercambio de mensajes entre ellos. Los componentes interactúan para conseguir un objetivo común.

Existen muchos tipos de implementaciones para el mecanismos de intercambio de mensajes, como el HTTP, RPC o listas de mensajes.

 

Programas y algoritmos distribuido

Un programa distribuido es un programa informático que ejecuta un algoritmo distribuido sobre un sistema distribuido. Mientras que un algoritmo distribuido es un algoritmo diseñado para ejecutarse en un sistema distribuido. Los problemas resueltos por algoritmos distribuidos más comunes son la elección de líderes, consensos, búsquedas distribuidas, generación de árboles de expansión (spanning tree), exclusión mutua y asignación de recursos. Los algoritmos distribuidos son un subtipo de algoritmos paralelos, los cuales se ejecutan típicamente de manera concurrente. En los algoritmos distribuidos, las partes que conforman el proceso están separadas y se ejecutan simultáneamente en procesadores independientes, teniendo cada una de ellas información limitada sobre lo que las otras partes están haciendo.

Tipos de arquitecturas distribuidas

En computación distribuida podemos diferenciar dos tipos de arquitecturas basándonos en la centralidad de la red como criterio de clasificación: las centralizadas y las descentralizadas. Esta clasificación va a influir en el modelo de toma de decisiones del clúster. Aunque cada herramienta tiene su propia arquitectura con sus peculiaridades, vamos a utilizar esta diferenciación para clasificarlas.

A continuación, vamos a tratar dos de los modelos de arquitectura más comunes en el Big Data: la arquitectura maestro-esclavo y la arquitectura p2p.

Arquitectura maestro-esclavo

Se trata de un modelo de arquitectura distribuida centralizado, en el que contamos con una organización jerárquica entre las máquina, diferenciando dos clases de nodos en la red: maestros y esclavos. Llamamos nodo maestro o master a las máquinas que coordinan el trabajo de otras máquinas; y esclavos, trabajadores o ejecutores a las máquina que realizan el trabajo que el nodo maestro les asigna. El nodo master sirve como centro de comunicación entre los nodos trabajadores y el sistema que solicita el resultado, ya sea un usuario u otro proceso.

arquitectura maestro-esclavo
Agradecimientos a icons8.com

Entre las ventajas de este modelo encontramos la escalabilidad, ya que podemos aumentar la capacidad del sistema añadiendo más nodos trabajadores a la red, y la tolerancia a fallos, ya que si uno de los nodos trabajadores falla, el sistema es capaz de recuperarse repartiendo el trabajo del nodo afectado al resto de trabajadores mientras este vuelve a estar disponible. Además la toma de decisiones se simplifica mucho al ser el nodo master el centro de todas las comunicaciones y órdenes.

Sin embargo, este modelo centralizado tiene también algunos inconvenientes, y los encontramos en el nodo maestro ya que por un lado es el único punto de contacto (SPOC – single point of contact) y a la vez el único punto de fallo (SPOF – single point of failure). Si el nodo maestro falla, perdemos todo el sistema. Por ello es común que se respalde esta arquitectura con un mecanismo multi-maestro en el que existen otros nodos maestros para reemplazar al que está operativo en caso de fallo, esto aporta la disponibilidad al modelo.

Esta arquitectura es muy utilizada y entre sus múltiple aplicaciones destaca por ser la base del modelo cliente-servidor, fundamental en el desarrollo de Internet.

Arquitectura entre pares

Comúnmente llamadas P2P o peer-to-peer por su traducción al inglés. Este es un modelo de arquitectura descentralizado en el que no existen diferencias entre los nodos de la red, se tratan como iguales. No existen nodos con funciones especiales, y por tanto ningún nodo es imprescindible para el funcionamiento de la red. Por esta razón se denomina arquitectura entre iguales o entre pares.

Al ser un modelo descentralizado no tiene los inconvenientes de punto de contacto único y de punto de fallo único. Esta arquitectura se caracteriza por su escalabilidad, tolerancia a fallos y alta disponibilidad, ya que todos los nodos pueden realizar cualquier función. Sin embargo, esta configuración requiere de un sistema de toma de decisiones más complejo al no tener una jerarquía.

arquitectura p2p
Agradecimientos a icons8.com

Arquitectura de Spark

arquitectura de apache spark

La arquitectura de Spark cuenta con un diseño modular que le permite adoptar diferentes configuraciones según la necesidad. Además de la flexibilidad que le aporta a Spark su diseño de programación, el modelo de computación maestro-esclavo le aporta escalabilidad y tolerancia a fallos, convirtiéndole en un todoterreno del Big Data.

Apache Spark es una de las herramientas más utilizadas en Big Data. En este artículo vamos a abordar la arquitectura de Spark tanto a nivel de software, como a nivel de hardware. Cada uno de estos enfoques le aporta a la herramienta características diferentes, que unidas definen el potencial de la herramienta.

Primero hablaremos de la parte software y su modelo de programación, que nos va a permitir entender la lógica del sistema. Y después hablaremos sobre su parte más física, su modelo de computación.

Arquitectura de Spark: el motor del Big Data

El motor de Spark lo conforman un conjunto de piezas, que unidas, le aportan las propiedades básicas. Estas piezas básicas que definen su funcionamiento, las podemos organizar en capas que se sustentan unas sobre otras, como si fuese una tarta.

Aunque la estructura de Spark es rígida y siempre debemos tener estas piezas básicas como pilares,  su diseño modular nos permite trabajar con ellas de manera independiente, lo que nos va a dar una gran flexibilidad a la hora de desarrollar nuestros proyectos.

Administrador de tareas

Administrador de recursos del clúster

Sistema de almacenamiento distribuido

¡Sin una de estas piezas ningún programa de Spark puede funcionar! A continuación, vamos a explicar cada uno de los pilares sobre los que se cimienta esta tecnología.

Sistema de almacenamiento distribuido

Spark no cuenta con una capa de almacenamiento, por lo que necesitamos un sistema de almacenamiento sobre el que apoyar la plataforma, además este deberá ser distribuido. Tendremos que usar algún sistema de almacenamiento externo para la gestión de los datos, como pueden ser el sistema de archivos distribuido HDFS, o los sistemas de bases de datos distribuidas HBase, MongoDB o Cassandra.

Esto nos aporta flexibilidad a la hora de procesar los datos, ya que al poder usar diferentes orígenes de datos, podremos elegir el que mejor se adapte a nuestro proceso.

Administrador de recursos del clúster

Sobre la capa de almacenamiento, se encuentra la capa de procesamiento. El administrador de recursos es la pieza dentro del motor de Spark que aporta a la plataforma la capacidad de gestionar los recursos disponibles en el clúster de manera autónoma.

Por defecto Spark cuenta con Spark Standalone Scheduler, un gestor de nodos muy básico. Así que generalmente nos apoyaremos sobre un administrador más potente como Mesos o YARN.

Administrador de tareas

Finalmente, sobre el sistema de almacenamiento que nos permite leer y escribir la información, y sobre el administrador de recursos que nos permite gestionar el procesamiento distribuido de los datos; situamos la pieza que gestiona las tareas a ejecutar.

Esta pieza es la base en la que se apoyarán el resto de módulos, es el núcleo del framework. Conocida como Spark Core, realmente es la pieza sobre la que trabajan todas las aplicaciones y es la que conocemos como Spark.

Extensiones: aumentando las funcionalidades de Spark

Estas capas de almacenamientos, procesamiento y planificación, sirven como base en la que desplegar diferentes complementos que aportan nuevas funcionalidades al sistema. Los propios desarrolladores de Spark han trabajado en varias librerías que extienden el alcance de esta herramienta, aunque también otros equipos trabajan desarrollando complementos sobre Spark.

Los módulos que podemos encontrar dentro del proyecto de Spark son:

  • Spark SQL: esta librería está diseñada para el tratamiento y consulta de datos estructurados y semi-estructurados. Con este módulo vamos a poder crear, transformar y realizar operaciones sobre estas estructuras de datos.
  • Spark ML y MLlib: estas librerías nos permiten realizar aprendizaje automático (machine learning) de manera escalable.
  • Spark Streaming: esta librería nos permite construir aplicaciones escalables y tolerantes a fallos para el tratamiento de datos en tiempo real (micro-batching). Con este módulo podemos recibir datos de una fuente en tiempo real, transformarlos y dejarlos en un destino.
  • Spark GraphX: esta librería nos permite el cómputo de grafos sobre Spark. Este módulo está disponible para menos lenguajes de programación que los anteriores, únicamente para Scala y Java.

Estas librerías comunes aumentan la productividad de los usuarios y pueden combinarse para crear flujos de trabajo complejos, creando así un motor unificado de procesamiento de datos a gran escala.

Spark SQL

Spark ML

Spark Streaming

Spark GraphX

Spark

Arquitectura maestro-esclavo

Acabamos de ver cómo se organiza el modelo de programación de Spark, pero ¿qué pasa con su modelo de computación? Spark es un framework de computación distribuida, lo que significa que vamos a tener varias máquinas interconectadas operando como una sola. Estas máquinas para organizarse necesitan una red por la que enviarse mensajes y establecer relaciones bien definidas entre ellas para realizar el trabajo. En este caso, tenemos un modelo maestro-esclavo en el que contamos con una organización jerárquica en la que una máquina, que denominaremos maestro, coordina el trabajo de otras, que llamaremos esclavos o trabajadores.

Escalabilidad

El modelo maestro-esclavo permite quitar o añadir máquinas a la red en cualquier momento sin tener que reiniciar el sistema. Esto permite que Spark pueda escalar aumentando o disminuyendo los recursos durante la ejecución de un proceso, según sea necesario.

Tolerancia a Fallos

Además, si uno de los nodos trabajadores de la red falla, su trabajo es asignado al resto de nodos trabajadores mientras el nodo afectado se recupera.

Disponibilidad

Sin embargo, el modelo de arquitectura maestro-esclavo tiene un punto débil en el nodo máster. Y es que este es crítico, si este nodo falla se pierde el punto de contacto de todas las conexiones del sistema y la ejecución del proceso fracasa. Para solucionar esto, existen otras herramientas como Apache Zookeeper que se encarga de reemplazar el nodo maestro por otro en caso de fallo para que el proceso pueda continuar hasta su finalización.

Como hemos visto, cuando hablamos de la arquitectura de Spark podemos hablar sobre la arquitectura software y su diseño modular, o sobre su arquitectura computacional basada en un modelo distribuido. Su diseño modular le aporta flexibilidad y le permite incorporar nuevas funcionalidades que le hacen más completo aún. Mientras que la arquitectura distribuida, le brinda la escalabilidad y la tolerancia a fallos por las que destaca entre los proyectos de Big Data.

Qué es Apache Spark

introducción a apache spark

Spark es un framework de computación distribuida diseñado para el procesamiento de grandes volúmenes de datos que permite dividir y paralelizar el trabajo. En esta introducción a Apache Spark vamos a explicar qué es, para qué sirve, cuándo debes usarlo y por qué debes usarlo.

Apache Spark es una herramienta software diseñada para tratar problemas computacionales de forma distribuida. Pero antes de explicar para qué sirve Spark, vamos a asegurarnos de que sabemos lo que es un framework o la computación distribuida. 

Un framework es un concepto abstracto que se define como un conjunto estandarizado de definiciones, prácticas, criterios y herramientas creado para abordar una problemática concreta. Se materializa en un software que ofrece un entorno de trabajo que sirve de referencia para los usuarios, lo que simplifica las tareas a la hora de resolver un problema.

Generalmente, cuando trabajamos desde nuestro ordenador  las tareas las realiza la propia máquina. En cambio, la computación distribuida nos permite asociar diferentes máquinas para que colaboren y se distribuyan las tareas entre ellas. Las tareas se dividen en subtareas más ligeras que son asignadas a las diferentes máquinas, reduciendo así la carga de trabajo de cada una de ellas y aumentando la capacidad total del grupo.

Spark permite el tratamiento, la consulta, el machine learning y el streaming sobre cantidades de datos, cantidades que antes de la aparición del Big Data eran impensables. Spark se caracteriza por su velocidad, facilidad de uso y generalidad. Además, su modelo de arquitectura le proporciona escalabilidad horizontal y tolerancia a fallos, por lo que Spark se ha convertido en una pieza clave para el Big Data.

¿Por qué usar Spark?

Spark es una herramienta que se ha ganado una gran reputación en el mundo del Big Data, tanto entre las empresas como entre los desarrolladores e investigadores. Esto es debido principalmente a su gran rendimiento y a que se trata de una herramienta de código abierto (licencia Apache), lo que se traduce en soporte por parte de la comunidad. Es realmente sencillo encontrar documentación y ayuda sobre la herramienta en la web, lo que democratiza aún más su uso. 

Origen de Spark

Apache Spark es la evolución de Apache Hadoop, una de las primeras herramientas Big Data. Spark fue desarrollado para evitar las limitaciones que planteaba el paradigma MapReduce en Hadoop.

Los procesos de Hadoop son muy lentos, el resultado de cada paso del proceso se escribe en disco para que el siguiente paso lo lea. Ante este hándicap, se plantea una solución más ágil. Spark almacena los datos en memoria en lugar de en disco como Hadoop, lo que hace que las ejecuciones sean más rápidas. Esta solución, junto con otras optimizaciones, permite a Spark procesar datos hasta 100 veces más rápido si lo comparamos con Hadoop.

La lectura y escritura en disco son de los procesos más lentos para un ordenador.​

Comparativa en tiempos de ejecución de una regresión logística para el mismo conjunto de datos

En ocasiones, cuando el volumen de los datos es demasiado grande como para almacenarlo en memoria, es necesario que Spark almacene los datos en disco. En estas situaciones, Spark tambíen es rápido cuando almacena datos a gran escala en disco. Esto hace que tengamos que encontrar el equilibrio entre lo que se almacena en memoria y lo que se almacena en disco, para tener una buena velocidad y para que el coste no sea demasiado elevado, ya que la memoria siempre es bastante más cara que el disco.

Aunque en los últimos años a Spark le han salido un gran número de competidores, sigue siendo el buque insignia del procesamiento en Big Data. En ciertos problemas concretos, como el procesamiento en tiempo real, Spark sale perdiendo ya que trabaja por lotes, y existen alternativas más adecuadas como Apache Flink que realmente opera en tiempo real. Pero la generalidad de Spark, su capacidad a adaptarse a casi cualquier tipo de terreno y su evolución constante por parte de la comunidad, le mantienen entre las soluciones más usadas.