La serialización con ArrayWritable parece funcionar de manera divertida
Estaba trabajando conArrayWritable
, en algún momento tuve que comprobar cómo Hadoop serializa laArrayWritable
, esto es lo que obtuve al configurarjob.setNumReduceTasks(0)
:
0 IntArrayWritable@10f11b8
3 IntArrayWritable@544ec1
6 IntArrayWritable@fe748f
8 IntArrayWritable@1968e23
11 IntArrayWritable@14da8f4
14 IntArrayWritable@18f6235
y este es el mapeador de prueba que estaba usando:
public static class MyMapper extends Mapper<LongWritable, Text, LongWritable, IntArrayWritable> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
int red = Integer.parseInt(value.toString());
IntWritable[] a = new IntWritable[100];
for (int i =0;i<a.length;i++){
a[i] = new IntWritable(red+i);
}
IntArrayWritable aw = new IntArrayWritable();
aw.set(a);
context.write(key, aw);
}
}
IntArrayWritable
se toma del ejemplo dado en el javadoc: ArrayWritable.
import org.apache.hadoop.io.ArrayWritable;
import org.apache.hadoop.io.IntWritable;
public class IntArrayWritable extends ArrayWritable {
public IntArrayWritable() {
super(IntWritable.class);
}
}
Realmente verifiqué el código fuente de Hadoop y esto no tiene sentido para mí. @ArrayWritable
no debe serializar el nombre de la clase y no hay forma de que una matriz de 100IntWritable
se puede serializar utilizando valores hexadecimales 6/7. La aplicación en realidad parece funcionar bien y el reductor deserializa los valores correctos ... ¿Qué está pasando? ¿Qué me estoy perdiendo