Spark, una de las herramientas BigData de mayor crecimiento y adopción en la actualidad, representa una gran oportunidad para las organizaciones de obtener los beneficios del análisis de datos a gran escala. Apache Spark ha emergido recientemente para integrarse y quedarse en el dominio del análisis de datos a gran escala. Veamos porqué:
Por algún tiempo, antes de la eclosión de Big Data y herramientas como Hadoop y particularmente Spark, se ha subestimado o descartado en el ambiente corporativo de sistemas y bases de datos la capacidad de utilizar procesamiento paralelo distribuido.
Esto puede considerarse justificado de alguna forma, dado que usualmente los sistemas para el soporte de las actividades diarias de las organizaciones, no representaban una dimensión en cuanto a escala de los datos que no pueda ser enfrentado por tecnologías más probadas, fáciles de entender y administrar a priori como sistemas cliente-servidor, mainframes, sistemas de 3 o 4 capas, bases de datos relacionales e integración de datos mediante middleware dedicados o Data Warehouses.
Sin embargo, en la actualidad, las empresas se enfrentan a un nuevo desafío: el uso generalizado de dispositivos móviles, redes sociales y almacenamiento con procesamiento en la nube hace que el volumen de datos de que se dispone para poder realizar tareas de análisis, como puede ser estudios de mercado a gran escala, analizar patrones de distribución o producción de materias primas e insumos, campañas masivas de publicidad, y soluciones más innovadoras como la integración de datos de sensores o mediciones de corporaciones industriales a nivel global, sea de un volumen difícilmente manejable con las mismas técnicas utilizadas para el soporte de las actividades operacionales. Todo esto, ya complicado de manejar debido más que nada a la escala, puede ser integrado con información proveniente de redes sociales y sus influenciadores, datos de dominio público como cotizaciones de bolsa y commodities y bases de datos NoSQL que proliferan por el mundo como soporte de aplicaciones de sistemas que se ofrecen en la nube y a través smartphones y dispositivos móviles de todo tipo.
Hace un tiempo ya, Hadoop se viene convirtiendo en el estándar de facto para el procesamiento masivo de esta información y es aquí donde una de las herramientas de su ecosistema ha demostrado su potencialidad: Spark.
Consiste en un conjunto de herramientas relativamente nuevas del ecosistema Hadoop destinadas a facilitar el análisis de datos. Como todo en Hadoop, Spark asume la existencia o la posibilidad de un volumen de datos masivos en gran escala (BigData) y almacenamiento y procesamiento distribuido utilizando commodity hardware.
Gracias a estos puntos y algunos más que veremos durante este artículo, Spark se está transformando en una de las herramientas de mayor adopción en el ambiente BigData corporativo, ya sea de compañías que buscan comenzar a realizar análisis masivos de datos y buscan una herramienta para ello donde Spark se adapta muy bien, como de otras que ya venían utilizando Hadoop mediante MapReduce o HIVE y buscan en Spark una mejora en velocidad y una disminución en la complejidad.
Spark, en lugar de estar basado en componentes de Hadoop como MapReduce, es una herramienta completamente independiente desde su concepción, pero por su naturaleza es fácilmente integrable dentro de otras aplicaciones Hadoop existentes. Spark está concebido como un "Sistema de computación en clusters de uso general", y se ha especializado hasta convertirse en una de las plataformas de soporte para al análisis de datos y la ciencia de datos más útiles, flexibles y competentes dentro de las opciones de hoy.
Una de las características distintivas es la utilización de lenguaje Scala: Spark no solo está escrito en Scala, sino que su API (Application Programmer's Interface) principal y el Spark Shell en el cual se pueden ejecutar operaciones sobre un cluster en tiempo real, están basados en Scala. Scala es un lenguaje de alto nivel que conjuga lo mejor de dos paradigmas de programación que se vuelven complementarios: programación funcional y orientada a objetos. Scala posee características clave para lograr con facilidad y simpleza especificar programas que se pueden ejecutar paralelamente en un entorno altamente distribuido como en los que se utiliza Spark.
La primera característica clave de Scala ampliamente aprovechada por Spark, es la posibilidad de realizar la especificación de las transformaciones de los datos mediante expresiones funcionales. El hecho de especificar funciones de transformación en lugar de procedimientos secuenciados le permite a Spark lograr con éxito uno de los principales preceptos del ecosistemas Hadoop: es más eficiente mover el procesamiento (mover el programa o función que realiza las transformaciones) para procesar los datos en el nodo del cluster donde los datos están almacenados, que mover los datos a través de la red.
El hecho de especificar transformaciones sobre los datos en un lenguaje funcional es una de las principales características que hacen de Spark altamente transparente para el analista o científico de datos, ya que se especifican a un alto nivel las funciones necesarias para obtener y transformar los datos, y Spark se encarga que dichas funciones se ejecuten paralelamente y de la maneras más eficiente posible de acuerdo a como estén almacenados los datos en nuestro cluster.
El otro concepto que maneja Scala es el de inmutabilidad de los objetos. Spark hace uso de esto, mediante de la generación de lo que se llama en Spark Datasets Resistentes y Distribuidos (RDD=Resilient Distributed Datasets). Cuando especificamos una transformación en los datos, Spark genera un RDD inmutable. Luego sobre un RDD podemos aplicar otras operaciones de transformación de Spark lo que termina generando un grafo de operaciones. Este grafo es lo que se denomina un DAG (Grafo dirigido acíclico). Este grafo y la inmutabilidad de los RDD es lo que le permite a Spark soportar otro de los requerimientos principales de un sistema BigData: la tolerancia a fallos.
Mediante esta arquitectura Spark puede recuperar los datos en cualquier punto del grafo, ya sea realizando todos los pasos anteriores para recuperar los datos de un RDD o utilizando la memoria de los nodos del cluster para generar puntos de almacenamiento intermedio, que además de facilitar a Spark la recuperación en caso de fallos hacen que la performance de Spark con respecto a tareas de MapReduce realizadas en Hadoop sea de 10 a 100 veces más rápida según las pruebas realizadas por el propio equipo de desarrollo de Spark.
Justamente la performance es una de las características que hacen distintivo a Spark con respecto a sus predecesores en el ambiente del análisis de datos a gran escala. La forma en que puede generar tareas complejas de análisis que involucran múltiples fuentes de datos, y además, la posibilidad de especificar sucesivas transformaciones y uniones sobre los mismos hace que este tipo de tareas complejas puedan especificarse y ejecutarse de una sola vez en un cluster de Spark, utilizando no solamente las capacidades de almacenamiento persistente y procesamiento de los nodos sino también un recurso básico como la memoria para almacenar datos a medida que se van procesando. Esto hace que la velocidad con que se realizan estas tareas de múltiples transformaciones sea muy buena si comparamos Spark con tareas de MapReduce de Hadoop donde se podía especificar un paso por vez y el almacenamiento entre pasos debía realizarse a disco.
Cabe mencionar que si bien Spark está basado en Scala no es el único lenguaje que soporta: tambien posee APIs para Java y Python además de diferentes librerías para integrarlo en otros lenguajes como Spark R, para el lenguaje R, muy utilizado para el análisis estadístico de datos.
Desde ya descartamos que Spark, como toda tecnología del ecosistema Hadoop, está concebida para eliminar los cuellos de botella típicos de todo sistema distribuido a gran escala. Además, aprovecha al máximo los recursos del cluster: almacenamiento, procesamiento y memoria. Spark tiende a minimizar la latencia entre etapas de procesamiento y mediante el concepto de dataste distribuidos que incluyen especificación en lenguaje funcional y los datos obtenidos en cada partición de los datos totales en los que se trabaja en cada etapa del grafo de operaciones, facilita la recuperación de fallos en forma total o parcial lo que lo diferencia de otras herramientas anteriores.
Spark es un conjunto de librerías y herramientas componentizadas en forma independiente y dada la amplitud y flexibilidad de las mismas, podemos decir que dichas herramientas constituyen lo que llamamos el "Ecosistema Spark".
Spark Core constituye el núcleo de Spark y consiste en el motor de ejecución de procesos de Spark, además de sus utilidades como el Spark Shell en Scala y las API en Scala, Java y Python. Spark Core está presente en toda implementación de Spark.
Spark SQL es un conjunto de librerías que se ejecutan sobre Spark y que proveen lo necesario para realizar consultas SQL sobre grandes volúmenes de datos no estructurados. Spark SQL es la herramienta más rápidamente adoptada por analistas de datos y científicos de datos para la realización de consultas ad-‐hoc para resolver preguntas del dominio específico donde se cuenta con Spark para proveer soporte a estas tareas.
Spark MLLib provee librerías con algoritmos de Machine Learning implementados en Spark y permite ejecutar análisis de regresiones y otros tipos de procesamiento de datos iterativos en un cluster Spark. Esto es muy utilizando en la denominada ciencia de datos para identificar patrones en los datos de forma automatizada entre otras tareas que se pueden realizar en Spark.
GraphX y Spark R son herramientas específicas de Spark que permiten, la primera analizar datos de relaciones que se pueden representar como grafos, donde los procesamientos de datos convencionales no pueden ser ejecutados y la segunda provee una interface con el lenguaje de análisis estadístico R muy utilizando en el ambiente de la ciencia de datos donde Spark se está volviendo cada vez más popular.
Como podemos ver Spark consiste en un conjunto de herramientas bastante completa por sí mismas y en su conjunto que permiten considerarlo como una de las tecnologías a tener en cuenta cuando se decide implementar un sistema corporativo de análisis datos a gran escala.
He mencionado en este artículo la oportunidad que representa para el ambiente de datos corporativo contar en el presente con herramientas confiables y sobre todo económicas para comenzar a trabajar con grandes volúmenes de datos. Para este tipo de organizaciones que van a comenzar a realizar proyectos BigData, Spark constituye una de las mejores opciones disponibles en la actualidad para procesamiento de datos distribuido, sobre todo si se puede implementar desde cero con las librerías necesarias para los requerimientos del proyecto, sin sobredimensionar la implementación ni caer en la complejidad innecesaria que combinar herramientas de diferentes fuentes puede ocasionar. En este caso de uso cada vez más frecuente de Spark, se debe considerar cómo obtener los datos de las fuentes de datos con que se cuenta y ver si se requerirá un repositorio para la información del estilo de HDFS o una base NoSQL para almacenar datos no estructuradas a ser procesados por Spark, y a la vez almacenar los resultados de los procesos desarrollados.
En este caso se pueden aprovechar datos de todos los sistemas existentes en el ambiente corporativo y combinarlos con información de dominio público o que se pueda adquirir de terceros. Es fundamental descartar en esta era, donde la información está almacenada en la nube cualquier preconcepto acerca de compartir datos o el acceso a los mismos, ya que si bien pueden implicar riesgos, si se analiza detenidamente, estos pueden ser menores si se contraponen con el beneficio de poder combinar estos datos a un nivel global. Por ejemplo, miles de corporaciones industriales posee en cada ubicación datos que miden el desempeño de sus procesos generados automáticamente y que mediante el uso de Spark podrían ser analizados en un contexto histórico e integrado. Spark permite además incorporar fuentes de datos externas, datos no estructurados y realizar todo tipo de análisis sobre ellos, ya sea mediante aplicaciones que utilicen Spark o consultas o algoritmos ad-hoc utilizando Spark SQL o Spark Machine Learning, para descubrir causalidad y patrones.
En un ambiente donde ya se vienen utilizando herramientas BigData como Hadoop HDFS, PIG o HIVE, la decisión de utilizar Spark puede basarse en dos aspectos fundamentales diferenciadores que ofrece: obtener una mejora en la performance de los procesos existentes y disminuir la complejidad de la implementación junto con la posibilidad de desarrollar nuevos algoritmos utilizando las librerías avanzadas de Spark y su flexibilidad a la hora de especificar transformaciones de datos.
En cuanto al desarrollo de aplicaciones, la API de Java puede considerarse al momento de integrar Spark en aplicaciones existentes en dicha plataforma. Pero no debe descartarse la posibilidad de adoptar Scala como lenguaje para el desarrollo de sistemas, o al menos de la parte que involucra la lógica del negocio y el manejo de datos, ya que además de aprovechar la facilidad de integración de Scala en Spark y de Java con Scala, estaremos proveyendo a nuestras capas fundamentales de software de un lenguaje de uso general y de más alto nivel donde podremos especificar de forma mixta y concisa objetos y funciones e incluso construir lenguajes específicos para el dominio a la vez aptos para ser ejecutados en ambientes altamente distribuidos y con gran volumen de datos donde Spark se destaca especialmente.
Si bien Spark forma parte de lo se conoce en el ambiente BigData como ecosistema Hadoop, este soporta una alta integración con el sistema de archivos distribuido de Hadoop (HDFS) y puede utilizarse en el contexto de la administración de recursos del cluster YARN, Spark permite ser instalado y ejecutado en clusters sin HDFS ni YARN y constituye un grupo de herramientas autosuficientes por sí mismas. Esto genera dos tendencias en las implementaciones actuales de Spark. La primera tendencia es utilizar Spark con HDFS, sobretodo en entornos donde ya existen aplicaciones basadas en MapReduce como PIG o HIVE y se busca reemplazar o complementar la funcionalidad existente. La segunda tendencia es implementar Spark en un cluster independiente y trabajar directamente sobre las fuentes de datos existentes.
No se puede aseverar por el momento cuál de las dos tendencias en el uso de Spark se impondrá sobre las otras, ya que se si bien cada empresa que adopta Spark lo hace para sus requerimientos específicos, todas las herramientas del ecosistema Hadoop y las propias herramientas de Spark se encuentran en un proceso de evolución muy activo con lo cual hay que estar preparado para ir enfrentando actualizaciones continuamente. Si bien ya se considera Hadoop como el sistema operativo de datos para el procesamiento de información a gran escala y actualmente Spark como la herramienta para procesamiento de datos de forma general dentro del ecosistema de mayor crecimiento en los últimos años, no hay que descartar en las otras múltiples librerías y utilidades existentes hasta que la industria dictamine cuáles de ellas sobrevivirán y cuales otras cesarán o serán absorbidas por parte de las herramientas más generales. Sin duda Spark es una de las que presenta una mejor perspectiva y mayor nivel de adopción corporativo en la actualidad y si está pensando en incursionar en el procesamiento distribuido y al análisis de datos, este framework constituye una buena opción en tecnologías para capacitarse. También a la hora de evaluar herramientas para implementar soluciones de datos corporativos, constituye una de las primeras opciones a tener en cuenta.
Esta obra está bajo una Licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.