Pregunta

Estoy pensando en la construcción de una pequeña aplicación de prueba en Hadoop para conseguir la caída del sistema.

La aplicación que tengo en mente estará en el reino de hacer las estadísticas. Quiero tener "Las 10 peores valores para cada clave" de mi función de reductor (donde debo asumir la posibilidad de un gran número de valores para algunas teclas).

Lo que he planeado es que los valores que entran en mi reductor, básicamente, la combinación de "El valor real" y "La calidad / relevancia del valor real". Sobre la base de la relevancia que "simplemente" quiero tomar las 10 peores / mejores valores y salida de ellos, desde el reductor.

¿Cómo hago para hacer que (suponiendo un gran número de valores para una clave específica)? ¿Hay una manera que puedo ordenar todos los valores antes de ser enviados al reductor (y simplemente deje de leer la entrada cuando he leído el primer 10) o debe hacerse esto de otra manera?

Puede alguien aquí que me señale un pedazo de código de ejemplo que puedo echar un vistazo a?


Actualización: Me encontraron dos cuestiones interesantes Jira Hadoop-485 y < a href = "http://issues.apache.org/jira/browse/HADOOP-686" rel = "nofollow noreferrer"> hadoop-686 .

Cualquier persona tiene un fragmento de código en el uso de esta en la API de Hadoop 0.20?

¿Fue útil?

Solución

Parece que usted quiere utilizar un combinador, que define qué hacer con los valores de su crean en el lado Mapa antes de ser enviados al reductor, pero después de que se agrupan por llave. El combinador a menudo se establece para que sea justo la clase reductor (por lo que reducir en el lado del mapa, y luego otra vez en el lado reducir).

Tome un vistazo a cómo el ejemplo de recuento de palabras utiliza el combinador de comprobar la validez de calcular los recuentos parciales:

http://wiki.apache.org/hadoop/WordCount


Actualizar Aquí es lo que tengo en mente para su problema; es posible que no he entendido bien lo que está tratando de hacer, sin embargo.

Cada mapeador emite pares <key, {score, data}>.

El combinador consigue un conjunto parcial de estos pares: <key, [set of {score, data}> y hace una especie local (todavía en los nodos mapper), y salidas <key, [sorted set of top 10 local {score, data}]> pares

.

El reductor recibirá <key, [set of top-10-sets]> - todo lo que tiene que hacer es realizar la etapa de combinación de tipo de combinación (sin clasificación es necesario) para cada uno de los miembros de los conjuntos de valores, y detener la fusión cuando se tira de los primeros 10 valores.


Actualización 2

Así que, ahora que sabemos que el rango que cumilative y, como resultado, no se puede filtrar los datos mediante el uso de principios de combinadores, la única cosa es hacer lo que usted sugiere - obtener una clasificación secundaria en marcha. Usted ha encontrado que las entradas correctas; hay un ejemplo de cómo hacer esto en Hadoop 20 en src / Ejemplos / org / apache / hadoop / ejemplos / SecondarySort.java (o, si no quiere descargar todo el código fuente, se puede ver en el ejemplo parchear en https://issues.apache.org/jira/browse/HADOOP-4545 )

Otros consejos

Sonidos definitivamente como un SecondarySortProblem. Echar un vistazo a "Hadoop: La guía definitiva", si te gusta. Es de O'Reilly. También puede acceder a él en línea. Hay que describen una muy buena aplicación.

He implementado por mí mismo también. Básicamente funciona de esta manera: El particionador cuidará de todas las claves pares de valores con la misma clave de ir a un solo reductor. Nada especial aquí. Pero también existe la GroupingComparator, que formará agrupaciones. Un grupo es en realidad pasa como un iterador para reducir uno () - llamar. Así que una partición puede contener varias agrupaciones. Pero la cantidad de particiones debe ser igual al número de reductores. Sin embargo, la agrupación también permite hacer un poco de clasificación, ya que implementa un método compareTo.

Con este método, se puede controlar, que el 10 mejor / peor / alto / bajo, sin embargo teclas alcanzarán el primer reductor. Así que después de leer estas 10 teclas, puede dejar el método de reducir sin ningún tipo de iteraciones adicionales.

La esperanza de que era muy útil: -)

Si entiendo la pregunta correctamente, usted tendrá que utilizar un TotalOrderPartitioner .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top