new icon example borderfactory java hadoop mapreduce iterable

java - icon - Ejecute la iteración sobre el componente de escritura personalizado en el reductor



my icon java (1)

El iterador de "valores" en el reductor reutiliza el valor a medida que itera. Es una técnica utilizada para el rendimiento y una menor huella de memoria. Detrás de escena, Hadoop deserializa el siguiente registro en el mismo objeto Java. Si necesita "recordar" un objeto, tendrá que clonarlo.

Puede aprovechar la interfaz de escritura y usar los bytes sin procesar para rellenar un nuevo objeto.

IntWritable first = WritableUtils.clone(values.next(), context.getConfiguration()); IntWritable second = WritableUtils.clone(values.next(), context.getConfiguration());

Estoy usando una clase escribible personalizada como VALUEOUT en la fase del mapa en mi trabajo de MR, donde la clase tiene dos campos, A org.apache.hadoop.io.Text y org.apache.hadoop.io.MapWritable . En mi función de reducción, recorro los valores de cada clave y realizo dos operaciones, 1. filtro, 2. agregado. En el filtro, tengo algunas reglas para verificar si ciertos valores en el MapWritable (con la clave como Text y valor como IntWritable o DoubleWritable ) satisfacen ciertas condiciones y luego simplemente los agrego a un ArrayList. Al final de la operación de filtro, tengo una lista filtrada de mis objetos editables personalizados. En la fase de agregado, cuando accedo a los objetos, resulta que el último objeto que se filtró con éxito, ha sobrescrito todos los demás objetos en la lista de arrays. Después de pasar por algunos problemas similares con listas en SO donde el último objeto sobrescribió a todos los demás, confirmé que no tengo campos estáticos ni reutilizo la misma escritura personalizable estableciendo diferentes valores (que se citaron como posibles razones para tal un problema). Para cada tecla en el reductor, me he asegurado de que las CustomWritable , Text y MapWritable sean objetos nuevos.

Además, también realicé una prueba simple al eliminar las operaciones de filtro y agregación en my reduce y simplemente iterar a través de los valores y agregarlos a una ArrayList usando un ciclo for. En el ciclo, cada vez que agregué un CustomWritable a la lista, registré los valores de todos los contenidos de la Lista. Me registré antes y después de agregar el elemento a la lista. Ambos registros presentaron que el conjunto anterior de elementos se sobrescribió. Estoy confundido sobre cómo esto podría suceder. Tan pronto como el siguiente elemento en el iterable de valores fue accedido por el bucle for ( CustomWritable result : values ) , se modificó el contenido de la lista. No puedo descubrir la razón de este comportamiento. Si alguien puede arrojar algo de luz sobre esto, sería realmente útil. Gracias.