2012-03-15 10 views
5

Decir que tengo valores de sellos de tiempo para los usuarios específicos en archivos de texto, comocómo analizar CustomWritable de texto en Hadoop

#userid; unix-timestamp; value 
1; 2010-01-01 00:00:00; 10 
2; 2010-01-01 00:00:00; 20 
1; 2010-01-01 01:00:00; 11 
2; 2010-01-01 01:00:00, 21 
1; 2010-01-02 00:00:00; 12 
2; 2010-01-02 00:00:00; 22 

tengo una clase personalizada "SessionSummary" implementar readFields y escritura de WritableComparable. Su propósito es resumir todos los valores por usuario para cada día calendario.

Así que el correlaciona las líneas a cada usuario, el reductor resume todos los valores por día por usuario y emite una SessionSummary como TextOutputFormat (usando toString de SessionSummary, como cadenas UTF-8 separados por tabuladores):

1; 2010-01-01; 21 
2; 2010-01-01; 41 
1; 2010-01-02; 12 
2; 2010-01-02; 22 

Si necesito utilizar estas sumarias-entradas para un segundo map/reduce el escenario, ¿cómo debería analizar estos datos resumidos para poblar los miembros? ¿Puedo reutilizar los readFields y los métodos de escritura existentes (de la implementación de interfaz WritableComparable) utilizando la cadena de texto como DataInput de alguna manera? Este (obviamente) no funcionó:

public void map(...) { 
    SessionSummary ssw = new SessionSummary(); 
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8")))); 
} 

En general: ¿Hay una mejor práctica para implementar teclas personalizadas y valores en Hadoop y hacerlos fácilmente reutilizables a través de varias etapas M/R, mientras se mantiene el texto legible por humanos salida en cada etapa?

(versión 0.20.2 es Hadoop/CDH3u3)

Respuesta

8

El formato de salida para su primer trabajo MR debe ser SequenceFileOutputFormat - esto va a almacenar la salida/valores clave del reductor en un formato binario, que puede entonces vuelva a leerlo en su segundo trabajo de MR utilizando SequenceFileInputFormat. También asegúrese de configurar outputKeyClass y outputValueClass en el Job según corresponda.

El asignador en el segundo puesto de trabajo tiene entonces SessionSummary (y cualquiera que sea el tipo de valor es)

Si necesita ver la salida textual del primer trabajo MR, puede ejecutar lo siguiente en los archivos de salida en HDFS :

hadoop fs -libjars my-lib.jar -text output-dir/part-r-* 

Esto permitirá la lectura de los principales pares de archivos de secuencia/valor y llamar a toString() en ambos objetos, separándolos pestaña cuando se da salida a la salida estándar. El -libjars especifica dónde hadoop puede encontrar sus clases personalizadas de clave/valor

+1

Gracias Chris! Entonces, para el segundo trabajo de MR, establezco conf.setInputFormat (SequenceFileInputFormat.class), y la clave de Mapper y las clases de valores son las mismas que en la salida del primer Reducer, ¿correcto? – thomers

+0

Eso es correcto. –

+0

¿Cómo configuro explícitamente la clave de Mapper y las clases de valor para el segundo trabajo de MR? Estoy probando con IdentityMapper, y espera que Text sea la clave. – thomers