miércoles, 29 de julio de 2020

Spark: la oportunidad


¡Vivimos una explosión de datos! Cada vez más se requieren más personas que sepan analizar y modelar estos datos para obtener la información. El dato es útil. El dato de alta calidad, bien entendido y auditable, no tiene precio. En este artículo vamos a dar una pincelada sobre este entorno de trabajo, un diamante en bruto, llamado Spark.




Obtenemos datos de todos los medios, como Twitter feeds, Facebook, mensajes, SMS, y una gran variedad de medios.  La necesidad de poder procesar esos datos tan rápidamente como sea posible se convierte en más importante que nunca. 

Hace unos pocos años, la programación mediante MapReduce ha sido útil para estos fines, pero la cantidad de tiempo que se tarda en ejecutar los trabajos no es la más aceptable en la mayoría de las situaciones. La curva de aprendizaje para escribir un trabajo MapReduce también es difícil, ya que requiere conocimientos específicos de programación y el know-how. Además en MapReduce los trabajos sólo funcionan para un conjunto específico de casos de uso. Necesitamos algo que funcione para un gran conjunto de casos de uso.


Apache Spark fue diseñado como una plataforma de computación rápida, de uso general y fácil de usar, de ahí viene su nombre: chispa.

Extiende el modelo MapReduce y lo lleva a otro nivel. La velocidad proviene de los cálculos en memoria. 

Las aplicaciones que se ejecutan en un proceso y con una respuesta mucho más rápida. Spark es incluso más rápido que MapReduce para aplicaciones muy complejas usando los discos. Puede ejecutar la aplicación por lotes, o algoritmos iterativos que se basan unos sobre otros. 

Se pueden ejecutar consultas interactivas y procesar datos de flujos continuos con una aplicación. 
Soporta un número de bibliotecas que pueden utilizarse fácilmente, para expandirse más allá de las capacidades básicas de Spark, son:


La gran facilidad de uso de Spark nos permite aprender rápidamente usando los APIs simples para Scala, Python, R y JavaSpark se ejecuta en clústeres Hadoop con YARN  o Apache Mesos, o incluso de manera autónoma con su propio planificador


¿Por qué y para qué querríamos usar Spark?


Spark proporciona procesamiento distribuido paralelo, tolerancia a fallos en hardware de productos básicos, escalabilidad, etc...Añade el concepto de computación agresiva en caché de memoria distribuida, con baja latencia, APIs de alto nivel y pila de herramientas de alto nivel. 

Hay dos grupos que podemos considerar aquí que querrían usar SparkCientíficos de Datos e Ingenieros (Analistas de Datos).

 ¿Pero no son similares?

En cierto sentido, sí, tienen superposición de conjuntos de habilidades, pero para nuestro propósito, vamos a definir al científico de datos como aquellos que necesitan analizar y modelar los datos para obtener información. Tendrían técnicas para transformar los datos en algo que pueden utilizar para el análisis de datos. 
  • Su análisis ad-hoc.
  • Ejecutar consultas interactivas que les proporcionen resultados inmediatamente. 
Los Científicos de datos también tienen experiencia en el uso de SQL, estadísticas, aprendizaje automático y algo de programación, por lo general usando lenguajes como Python o R.

Una vez que los científicos de datos han obtenido la información sobre los datos; más tarde, alguien determina que hay una necesidad de desarrollar una aplicación de procesamiento de datos de producción, una aplicación web, o algún sistema, la persona llamada a trabajar en ello estarían los ingenieros (analistas de Datos).

Los ingenieros (analistas de datos) utilizarían la API de programación de Spark para desarrollar un sistema de casos de uso. Spark paraleliza estas aplicaciones a través de los clústeres mientras se ocultan las complejidades de la programación de los sistemas distribuidos y tolerancia a fallos.  Pueden usar Spark para monitorear, inspeccionar y ajustar las aplicaciones. 

Spark Core, componentes...


El núcleo de Spark (Core) está en el centro de todo. Es un sistema de propósito general que proporciona programación, distribución y supervisión de las aplicaciones a través de un grupo de componentes.

Los componentes en la parte superior del Spark Core que están diseñados para trabajar internamente, dejando que los usuarios los combinen, como lo harían con cualquier biblioteca en un software de proyecto. El beneficio de esta pila es que todos los componentes de la capa superior heredarán las mejoras realizadas en las capas inferiores. 

El Spark Core está diseñado para escalar de uno a miles de nodos. Proporciona la abstracción fundamental de Spark: Resilient Distributed DataSet (RDD):
  • Resilient (Flexible): si se pierden los datos en la memoria, se pueden volver a crear
  • Distribuido: procesado en todo el clúster 
  • DataSet (conjunto de datos): los datos iniciales pueden provenir de una fuente, como un archivo, o pueden ser creados mediante programación

Los RDD son anteriores a Spark SQL y al API de los DataFrame / Dataset.

Spark SQL está diseñado para trabajar con Spark a través de SQL y HiveQL e Impala. Spark SQL permite a los desarrolladores mezclar las consultas de SQL con el lenguaje de programación de Spark elegido: Python, Scala, R o Java. 

Funciona con datos estructurados


DataFrames y Datasets que son la abstracción de los datos estructurados. Posee además un entorno de optimización de las consultas: el Catalyst Optimizer

Spark Streaming proporciona acceso al proceso de flujos de datos en tiempo real. Su API coincide con el de Spark Core, lo que facilita a los desarrolladores moverse entre aplicaciones que procesan los datos almacenados en la memoria y/o llegar a ejecutarlos en tiempo real, proporcionando el mismo grado de tolerancia a fallos, rendimiento y escalabilidad que ofrece el Spark Core.

MLlib, la biblioteca de aprendizaje automático de máquina (Machine Learning), proporciona múltiples tipos de algoritmos que están diseñados para escalar a través del clúster.

GraphX es una biblioteca de procesamiento de gráficos (Graph Processing) con API para manipular gráficos y realizar gráficos computacionales en paralelo.

Los DataFrames y los DataSets son la representación principal de los datos en Spark.
  • Los DataFrames representan datos estructurados en forma de tabla. Son similares a las tablas en un RDBMS. Consisten en una colección de objetos Row (fila) sin escribir. Las filas se organizan en columnas descritas por un esquema. 
  • Los DataSets representan datos como una colección de objetos de un tipo específico. Están fuertemente tipados
  • Realmente un DataFrame es un alias de un Dataset [Row]: conjuntos de datos que contienen objetos Row (filas)
Cómo veis, el entorno de Spark no es difícil ni complicado, simplemente requiere perseverancia para familiarizarse con él y una vez conseguido estaréis en disposición de entrar en un mundo apasionante, desafiante y novedoso tecnológico. Espero que pongáis más de una chispa en vuestro camino.





¡Hasta el próximo post queridos lectores!







jueves, 23 de julio de 2020

Tecnologías Web 106

Visto en Tecnologías Web 105 como algunas tecnologías solucionaban el problema con el SEO de las SPAs, ahora vamos a comentar cuales son las que han aparecido estos últimos 2 años y las nuevas versiones que llegan de aquellas que ya existían y de las que hemos hablado en los anteriores posts.



Nuevas generaciones


En el año 2018, sale la versión 3 de Polymer, en la que como novedad, han cambiado una de sus especificaciones, HTML Imports deja de usarse a cambio de ES Modules después de que varias compañías entre las que se encuentra Mozilla se negara a implementar la primera especificación en su navegador.


El equipo encargado de desarrollar Polymer ha presentado LitElement, una clase de JavaScript con la que vamos a poder crear nuevos componentes que podremos usar en cualquier aplicación sin importar si se ha creado con React, Angular o cualquier otro framework. Esto es posible porque todo lo que usa LitElement son funcionalidades nativas de JavaScript. Y según parece este será el futuro de Polymer.



Este mismo año el creador de NodeJS, Ryan Dahl, publica su nuevo proyecto, Deno, que es el NodeJS que quería haber creado desde un principio. Deno es un entorno de ejecución de JavaScript y TypeScript. Aquí la primera diferencia respecto a Node, esta nueva herramienta soporta el código TypeScript de forma nativa, por tanto no vamos a tener que configurar nada para poder ejecutar el código TS, sino que Deno se encargará de todo. Otra diferencia respecto a Node y que llama mucho la atención es que no tiene un gestor de paquetes como NPM, sino que cuando vayamos a necesitar usar una dependencia en nuestro proyecto, solo tendremos que importarla desde la URL donde se encuentre publicada. ¿Superará Deno a Node? Supongo que lo iremos viendo con el tiempo, actualmente ya se está hablando de esta tecnología así que es cuestión de tiempo que lo veamos que pasa con ellas.

En 2019, sale una nueva versión de React, que trae como novedad los React Hooks, una serie de funciones para los componentes funcionales que nos permiten reutilizar lógica entre distintos componentes, además de que nos proporcionan funcionalidades que antes no se podían usar en este tipo de componentes (como añadir un estado o usar los métodos del ciclo de vida). Por supuesto también podemos crear nuestros propios Hooks, y ya existe algún repositorio en el que podemos encontrar una gran cantidad de ellos que ha ido creando la comunidad.

El futuro


Para terminar con esta serie de posts, en 2020, está pendiente de salir la versión 3 de Vue que va a traer su versión de los React Hooks, la Composition API, para permitir la reutilización de funcionalidad entre los componentes de una forma más sencilla a como se tenía que hacer hasta ahora, que es con los mixins. En cuanto a las otras novedades que trae, el paquete de Vue pesará menos y será más rápido, además de que tendrá un mejor soporte con TypeScript.


Durante este mismo año, también saldrá la nueva versión de Webpack (que al tiempo que escribo esto se encuentra en fase beta) que eliminará algunas de las funcionalidades que se habían deprecado, y traerá algunas nuevas como la caché persistente o mejoras como por ejemplo en el hashing. Una de las funcionalidades más llamativas es el module federation, un plugin que va a facilitar la creación de lo que se conoce como micro frontends, permitiendo compartir entre los distintos builds aquellas dependencias que tienen en común, entre otras cosas.




Y con esto hemos dado un repaso a la evolución de las tecnologías web desde los inicios hasta estos últimos años donde parece que no han salido tantas librerías y frameworks, pero es muy probable que estén ahí y necesiten ser encontradas.

Mientras tanto en otra parte del planeta:


Tecnologías Web 105

La web moderna.

En este penúltimo post veremos como empiezan a aparecer librerías y frameworks enfocados al frontend para el desarrollo de las SPAs, y como empiezan a salir algunas soluciones para enfrentarnos al principal problema que plantean este tipo de aplicaciones, el SEO. Pero si todavía no has leído el anterior post, deberías de leerlo primero, Tecnologías Web 104.


HTML nuevo, JS nuevo


Después de varios años sin novedades nuevas de HTML, en 2014 sacan HTML5 que trae consigo un conjunto de etiquetas nuevas (nav, header, footer, main...) que añaden un significado al contenido de estas y nos ayudan a reducir el uso de las etiquetas div, y otras como la etiquetas audio y video que permiten reproducir contenidos multimedia de forma nativa (algo que hasta ahora solo podíamos hacer con Flash).

Otra de las novedades más importantes de HTML5 son todas las APIs que traen y que nos van a permitir acceder a la cámara del dispositivo, a la ubicación, almacenar datos de forma local...

Este año, Evan You, un extrabajador de Google, publica Vue, un framework progresivo, lo que quiere decir que vamos a poder usarlo como si fuera una librería al estilo de React, o para cosas más complejas al igual que haríamos con Angular. Si ya tenemos un proyecto con cualquier tecnología y queremos pasarlo a Vue, podremos hacerlo de poco a poco ya que no es necesario tener una configuración compleja como ocurre con React o Angular que la necesitan para transpilar el JSX o el TS.

A mi parecer, Evan ha ido picoteando un poco de cada librería y framework existentes hasta este momento quedándose con lo mejor de cada uno para añadirlo a Vue. Y es por lo que ha recibido el apoyo de la comunidad y por lo que actualmente se ha posicionado como uno de los frameworks o librerías más usadas para el frontend.

No olvidemos que también han sacado un documental sobre Vue, al igual que hicieron en su momento con Ember.

Y llegamos al año 2015, el año en que sale una nueva versión del estándar de JavaScript, EcmaScript 6.

ES6 es una de las versiones más importantes de JavaScript hasta la fecha, debido a todas las novedades que trae consigo. Entre las novedades nos encontramos algunas como las arrow functions, las promesas, las dos nuevas formas de declarar variables o la sintaxis para declarar clases más parecida a como se hace en otros lenguajes.

Por otro lado, Dan Abramov inspirado por el patrón Flux que recomienda usar Facebook para gestionar el estado en las aplicaciones de React, publica Redux, una librería muy sencilla que aunque parece que se asocia solo a React, también se puede usar con cualquier otra librería o framework sin ningún problema.

Con Redux vamos a tener todo el estado en un único sitio, que solo se va a poder modificar a través de unas funciones llamadas reducers a las que se le mandan acciones que indican el cambio que hay que realizar sobre el estado.


Yendo a lo nativo


Siguiendo con el ecosistema de React, este año se presenta React Native, una librería construida sobre React, y que permite construir aplicaciones móviles nativas para Android e iOS usando unos componentes predefinidos que trae la librería. Usan un elemento al que se refieren como Bridge que se encarga de realizar la comunicación entre la parte de JavaScript y la parte nativa. React Native va mandando mensajes que describen la acción que hay que ejecutar, y la parte nativa la ejecuta

Este mismo año, Facebook se encuentra con el problema de que tienen que desarrollar su aplicación móvil de forma nativa y la API para traer los datos que necesitan en el feed no les sirve porque es una interfaz muy compleja en la que hay que mostrar muchos datos. Entonces surge la idea de GraphQL,  un lenguaje de consultas con el que consiguen traer los datos que necesitan con una sola petición, en lugar de tener que realizar varias peticiones como se venía haciendo.

Y esta es otra de las herramientas sobre las que podemos encontrar un documental.

Por último, este año, aparece Polymer, una librería de JavaScript para crear aplicaciones web mediante el uso de componentes. Al principio había unos pocos componentes básicos que proveían de una funcionalidad genérica que sirve para la mayor parte de las aplicaciones, pero han ido añadiendo nuevos componentes según han ido saliendo las nuevas versiones. Es una librería que siempre ha ido de la mano de las especificaciones que definen los Web Components.

Durante el 2016 el equipo de Google presenta Angular 2 en una conferencia, causando un gran revuelo entre la comunidad ya que habían rediseñado el framework por completo. En esta versión han decidido apostar por TypeScript como lenguaje de programación, han cambiado la sintaxis de las directivas, y lo que en la antigua versión eran los controladores, ahora son los componentes.

Desde entonces han ido sacando distintas versiones de Angular, aproximadamente una cada 6 meses, pero ninguna con grandes cambios como de AngularJS a Angular 2 (de momento).

Sobre el ecosistema de Vue aparecen dos herramientas nuevas.

De SPA a universal


Una de ellas es Nuxt, un framework construido sobre Vue que nos permite crear aplicaciones de una forma muy rápida ya que no nos tenemos que preocupar por configurar casi nada. Cuando digo casi nada, me refiero a que ni siquiera tendremos que configurar el router, ya que el va a ir generando las rutas a partir de los archivos y carpetas que añadamos dentro de la carpeta pages, tampoco Vuex, ni .

Pero no solo esto, lo mejor de Nuxt (a mi parecer) es que podemos hacer que nuestra aplicación sea una SPA, realice el primer renderizado en el servidor (mejorando el SEO) o genere archivos HTML estáticos a partir de las rutas que tenga nuestra aplicación, y todo ello de una forma muy sencilla.

Además también hay que decir que tiene una lista increíble de módulos que añaden cierta funcionalidad a nuestra aplicación y por tanto nos simplifican el trabajo evitando que tengamos que configurar otras cosas que no trae por defecto, como por ejemplo alguna librería de componentes.

Y por otro lado, surge Vuex que es el gestor de estado para las aplicaciones de Vue. Esta librería se basa en Redux y por tanto en el patrón Flux, pero está diseñada para usarla solo con Vue al contrario de lo que ocurre con Redux. En este caso, los elementos con los que nos encontramos son las acciones que se despachan desde la vista y en las que vamos a realizar las operaciones asíncronas, después tenemos las mutaciones que se encargan de realizar el cambio en el estado, y los getters que nos devuelven parte del estado para usarlo en las vistas.

En 2017 surge un nuevo competidor para aquellas tecnologías como React Native o Ionic que nos permiten crear aplicaciones nativas e híbridas usando los lenguajes propios de la web, es decir, HTML, CSS y JS. Flutter nos va a permitir crear aplicaciones nativas para Android e iOS mejorando considerablemente el rendimiento ya que estas aplicaciones construidas con Dart se van a compilar usando librerías de C a código máquina.

Las otras tecnologías a nombrar este año son Next y Angular Universal. Donde Next es la alternativa a Nuxt para la librería de React, mientras que Angular Universal solo permite realizar el primer renderizado de las aplicaciones de Angular en el servidor.

Terminamos este post aquí, dejando para el siguiente aquellas tecnologías que han salido durante los últimos dos años y las nuevas versiones de algunas de las que ya hemos hablado en esta serie de posts. No os perdáis Tecnologías Web 106.