Foro Formación Hadoop

 
 
Imagen de Víctor Molina Palomar
Hadoop Secondary Sort
de Víctor Molina Palomar - martes, 29 de noviembre de 2016, 17:45
 

Buenas tardes,

Me surge la duda de en que situaciones se utiliza el método seconsary sort descrito en la documentación. Lo que he entendido, y no se si estoy en lo cierto, es que en el mapper se genera una clave compuesta de varios campos pero para determinar el reducer al que se envía sólo se tiene en cuenta uno de los campos clave.

 

Me pregunto que diferencia hay entre esto y tener una clave compuesta, cuyo método compareTo utilice ambos campos, pero determinar el reducer utilizando sólo uno de los campos.

 

Me gustaría ver un ejemplo concreto de aplicación de este método para entenderlo correctamente

 

Un saludo

 
Imagen de Fernando Agudo
Re: Hadoop Secondary Sort
de Fernando Agudo - miércoles, 30 de noviembre de 2016, 09:37
 

Hola Victor, 

Más o menos estas en lo cierto. 

El algoritmo "secondary sort" se utiliza para poder determinar el orden de los valores que recibe el reducer para cada una de las keys.

Si te fijas en la documentación, si utilizas una clave simple, o una clave compuesta, esto te valdrá para que la aplicación mapreduce agrupe todos los valores para esa clave y las envíe al correspondiente reducer.

En cada una de las ejecuciones que realizaras de la aplicación, los valores asociados a esa clave podrían variar de orden, mapreduce no te asegura un orden concreto para los valores de una clave (si el orden de las claves). 

Si lo que necesitamos es ordenar los valores, necesariamente debemos utilizar el "secondary sort", con lo que tendremos que crear una clave compuesta, siendo la primera parte la que va a marcar la manera de agrupar todos los valores para esa determinada parte de la clave (como sucede en el método "tradicional" descrito anteriormente). El segundo valor nos servirá para realizar el orden de los valores, para asegurarnos un orden fijo a pesar de que ejecutemos varias veces la aplicación.

 

Un caso de ejemplo podría ser:

Tenemos un dataset con los datos de las temperaturas máximas obtenidas para cada uno de los días del año 2015 para la ciudad de Madrid.

Lo que necesitamos es obtener la temperatura más alta obtenida para cada uno de los meses del año.

Por lo que tendríamos como clave compuesta (Mes,temperatura) y como valor el registro completo (tiene más datos que nos puede interesar (latitud, longitud, día, hora, etc).

De esta forma, realizando el secondary sort, agruparíamos los valores por el mes(todas las temperaturas del mes) y los valores irían ordenados de mayor a menor en base a la temperatura (segunda parte de la clave compuesta). Pudiendo asegurar que el primer valor del iterador del reducer va a ser el registro que buscamos (Temperatura más alta del mes).

Si no se utilizara el secondary sort, también podríamos resolver el problema pero tendríamos que recorrer completamente el iterado del reducer, para ir buscando entre los valores la temperatura máxima obtenida (esto cuando trabamos millones de registros, nos va a ocasionar un problema de rendimiento-memoria).

 

Por otra parte, si utilizas una clave compuesta normal (como indicas en la última parte de la pregunta), lo que estarías haciendo es enviar todos los valores asociados a esa clave: por ejemplo todos los valores de enero-22º. Este par de key-value tendría los registros que tuvieran esa misma temperatura, no nos valdría para solucionar nuestro problema de agrupar TODAS las temperaturas del mes (enero-15º estaría en otro reducer...)

 

Espero que te sirva de ayuda.

Un saludo.