[AUDIO_EN_BLANCO] [MÚSICA] Bienvenidos. En este vídeo, vamos a presentar el modelo de programación MapReduce, que es el que se basa en el sistema, el ecosistema Hadoop. Como you sabemos, el ecosistema Hadoop contiene un sistema de ficheros HDFS, un gestor de recursos YARN, y un modelo de programación es es MapReduce que es el que vamos a describir en este vídeo. Cuando necesitamos realizar una operación en Big Data, vamos a tener que procesar un gran conjunto de datos y vamos a tener que realizar operaciones con un gran conjunto de registro, de datos que debemos analizar. Entonces, lo que tenemos que hacer es, de estos registros, ir extrayendo la información que consideremos relevante para nuestra aplicación y ordenar y combinar esta información de modo que resulte lo más interesante posible para el usuario. Y una vez que vamos ordenando y recopilando toda esta información, la vamos a tener que ir combinando para extraer unos resultados finales que sean los que sean realmente útiles para el usuario. Para poder realizar todas estas operaciones de una forma eficiente, un modelo adecuado es utilizar un modelo Master Worker. En este modelo Master Worker, tenemos un conjunto muy grande de datos y este conjunto de datos lo vamos a dividir en una serie de subconjuntos, en una operación de partición o splitting. Entonces, vamos a asignar cada uno de estos fragmentos de los datos a un proceso que podríamos denominar Proceso Worker, estos procesos workers van a procesar los datos que les han sido asignados, y van a ir generando unos resultados parciales que, a su vez, van a ser combinados para obtener los resultados finales de respuesta de nuestro sistema. Así tenemos el master que distribuye los datos a los workers, los workers que los procesan y devuelven los resultados al master que vuelve a agregar los resultados finales y alcanza la respuesta final de nuestro problema. Pues un modelo que responde a esta estructura general, es el modelo que se denominó MapReduce. MapReduce nos va permitir procesar grandes cantidades de datos de forma paralela y va a permitir explotar las características de los sistemas actuales de cómputo distribuido y paralelo. Es decir, que todos estos grandes de datos podrán, grandes cantidades de datos, podrán ser procesados de forma paralela y así ahorrar tiempo y obtener los resultados de una forma más rápida. Por otro lado, tenemos que MapReduce es un framework que es altamente escalable y permite incrementar el número de nodos y el volumen de datos con el que vamos a trabajar, sin degradar el rendimiento de nuestro sistema ni aumentar los tiempos de cómputo de forma significativa, y vamos a tener que fundamentalmente, como su nombre lo indica, el modelo MapReduce nos ofrece dos fases fundamentales, una fase de mapeo o distribución de los datos, y una fase de reducción o Reduce, que va a recoger los resultados finales. Entonces, tenemos que la fase de mapeo va a ser realizada por unos procesos, por unos procesos Mappers, que estos procesos Mappers se van a ejecutar en los nodos y en los que se encuentran almacenados los datos que vamos a procesar. Entonces, estos nodos Mappers vamos a tener un cierto número de, de estos Mappers, que va a depender del entorno en el que nos estemos ejecutando, y no tanto de el, no va a ser configurado por el desarrollador o por el programador. Entonces, estos nodos Mappers van a generar un conjunto de pares clave-valor que nos van a ir clasificando la información que van procesando, y van a enviar estos pares clave-valor a la siguiente fase que va a ser la de ordenación, o sort and shuffle, o un combine, depende del procesamiento concreto va a denominarse de una manera o de otra. Entonces, la fase de ordenación vamos a ir recibiendo estos pares clave-valor que van a ir generando los distintos procesos Mappers de nuestro sistema, y van a ordenar estos valores para mandarlos a los procesos Reducers, los que realizan la operación de reducción, para ir posteriormente agregando los resultados y obteniendo los resultados finales. Entonces, podemos ver este esquema en un modo más gráfico, más visual, donde tendríamos un conjunto de datos de entrada, y estos datos de entrada lo vamos a dividir en una serie de subconjuntos de datos de entrada, mediante una operación de splitting o partición. Estos datos particionados son enviados a los distintos procesos Mappers que los van a generar los pares clave-valor y, a su vez, se va a realizar la operación de ordenación, o sort and shuffle, para combinar estos resultados y enviarlos a los procesos Reducers, que van a ser los que van a hacer la operación de reducción proporcionando los resultados finales. Veamos un caso concreto muy típico que es el de realizar un contador de palabras. Tendríamos unos datos que sería un conjunto de palabras en este ejemplo de aquí, pues tenemos las palabras casa, casa, gato, casa, gato y loro. Entonces, vamos a distribuir estos datos y al primer, en tres conjuntos por ejemplo, y al primer conjunto recibe las palabras casa, casa, el segundo conjunto recibe las palabras gato y casa, y el tercer conjunto recibe las palabras gato y loro. Y estos tres conjuntos son enviados a tres procesos Mapper que van a realizar la generación de los pares clave-valor. Es decir, que vamos a ir recibiendo las, analizando las distintas palabras que recibimos, y analizando, e introduciendo un contador con las apariciones de estas palabras. Entonces, por ejemplo, tendremos el primer fragmento recibe la palabra casa, aparece una vez, la palabra casa aparece una vez; el segundo fragmento la palabra gato que aparece una vez, la palabra casa que aparece una vez y así sucesivamente. Una vez que los distintos Mappers van generando los procesos clave-valor se produce una operación de ordenación e intercambio de los valores, de modo que tenemos que, por ejemplo, la palabra casa se ha encontrado dos veces en el primer Mapper, y una vez en el segundo Mapper, y agregamos estos resultados correspondientes a la palabra casa. La palabra gato se ha encontrado una vez en el segundo Mapper, y una vez en el tercer Mapper. Y la palabra loro se ha encontrado únicamente una vez en el tercer Mapper. Entonces, combinamos estos resultados y los mandamos a los procesos Reducers que realizan la operación de reducción, y obtenemos que la palabra casa se ha obtenido en tres ocasiones, la palabra gato se ha obtenido en dos ocasiones, y la palabra loro se ha obtenido únicamente en una ocasión. Si miramos cómo podría hacer un pseudocódigo aproximado para realizar estas operaciones, tenemos un código correspondiente al proceso Map, que este código recibe el texto y va a buscar para cada una de las palabras que encuentra en ese texto, va a emitir la palabra y la aparición de ese texto, es decir, palabra 1. Y así para todas las palabras que va procesando en el texto. Después, cuando vayamos you al proceso de reducción que tenemos aquí a continuación, pues lo que vamos a hacer va a ser introducir para cada una de las palabras que hemos encontrado, vamos a sumar las apariciones que se han producido de esa palabra, de modo que al final emitiremos la palabra y el número total de apariciones que se han producido en los distintos procesos. De modo que asi agregamos el contador final para cada una de las palabras. Este es un ejemplo muy clásico y muy utilizado para explicar el concepto de MapReduce, pero también podemos utilizar el mismo concepto de MapReduce, por ejemplo, para realizar una operación como podría ser una multiplicación de una matriz por un vector. Como you sabemos, tenemos una matriz que es una matriz cuadrada en este caso, con tres filas y tres columnas y tenemos un back vector con tres elementos. Para realizar la multiplicación de la matriz por el vector vamos a multiplicar la primera fila de la matriz por el vector, la segunda fila de la matriz por el vector, y la tercera fila de la matriz por el vector, para obtener las distintas componentes del vector resultante. Entonces, tenemos que sumar pues la componente a00 de la matriz, multiplicada por b0, con la componente a11 de la matriz, por la componente b1 del vector, más la componente a02 de la matriz multiplicada por la componente b2 del vector. De modo que, para obtener el elemento c0. De modo que vamos a poder realizar esta misma operación mediante un proceso MapReduce, en donde tenemos el proceso Map, que lo que va a hacer va ser emitir un valor en el que tengamos el índice del valor que queremos calcular, y el término correspondiente al producto del término correspondiente de la fila por el término correspondiente del vector. Y después, en la operación de reducción, simplemente lo que vamos a hacer va a ser sumar aquellas componentes que pertenecen al mismo índice, y you tenemos calculado el producto final de la multiplicación matriz vector de una forma muy sencilla. Así pues, vemos que el modelo de programación MapReduce es un paradigma de programación sencillo que es altamente escalable y que permite explotar las capacidades de paralelismo y para el análisis y el procesamiento de los datos y permite realizar distintos tipos de operaciones como era el caso del contador de palabras o la multiplicación de matriz vector que hemos visto en los ejemplos anteriores. Es un modelo que ha sido muy adecuado para procesar grandes cantidades de datos, ha sido adoptado de forma general por todos los entornos de procesamiento de datos en Big Data, y en particular, es el núcleo del sistema Hadoop que es el más comúnmente extendido. [MÚSICA] [MÚSICA]