hadoop - Cómo leer un registro que se divide en varias líneas y también cómo manejar registros rotos durante la división de entrada
mapreduce input-split (2)
Tengo un archivo de registro como a continuación
Begin ... 12-07-2008 02:00:05 ----> record1
incidentID: inc001
description: blah blah blah
owner: abc
status: resolved
end .... 13-07-2008 02:00:05
Begin ... 12-07-2008 03:00:05 ----> record2
incidentID: inc002
description: blah blah blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah
owner: abc
status: resolved
end .... 13-07-2008 03:00:05
Quiero usar mapreduce para procesar esto. Y quiero extraer la identificación del incidente, el estado y también el tiempo que se tomó para el incidente
Cómo manejar los registros ya que tienen longitudes de registro variables y qué pasa si la división de entrada ocurre antes de que el registro finalice.
Tendrá que escribir su propio formato de entrada y el lector de registros para garantizar la división adecuada de archivos alrededor de su delimitador de registros.
Básicamente, su lector de registros deberá buscar su desplazamiento de bytes divididos, escanear hacia adelante (leer líneas) hasta que encuentre:
- la línea
Begin ...
- Lea las líneas hasta el siguiente
end ...
línea y proporcione estas líneas entre el inicio y el final como entrada para el siguiente registro
- Lea las líneas hasta el siguiente
- Escanea el final de la división o encuentra EOF
Esto es similar en algoritmo a cómo XMLInputFormat de Mahout maneja el XML multilínea como entrada; de hecho, es posible que pueda modificar este código fuente directamente para manejar su situación.
Como se menciona en la respuesta de NLineInputFormat
, NLineInputFormat
es otra opción si sus registros tienen un número fijo de líneas por registro, pero es realmente ineficiente para archivos más grandes ya que tiene que abrir y leer todo el archivo para descubrir los desplazamientos de línea en getSplits()
del formato de getSplits()
método.
en sus ejemplos, cada registro tiene el mismo número de líneas. Si ese es el caso, podría usar NLinesInputFormat, si es imposible saber el número de líneas, podría ser más difícil. (más información sobre NlinesInputFormat: http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/lib/NLineInputFormat.html )