2011-05-08 18 views
6

Estoy usando el programa de ejemplo Hadoop WordCount para procesar un gran conjunto de pequeños archivos/páginas web (aproximadamente 2-3 kB). Como esto está muy lejos del tamaño de archivo óptimo para los archivos hadoop, el programa es muy lento. Supongo que es porque el costo de configurar y desgarrar el trabajo es mucho mayor que el trabajo en sí. Dichos archivos pequeños también causan el agotamiento de los espacios de nombres para los nombres de archivo.Procesando un conjunto grande de archivos pequeños con Hadoop

He leído que en este caso debería usar el archivo HDFS (HAR), pero no estoy seguro de cómo modificar este programa WordCount para leer desde este archivo. ¿El programa puede seguir funcionando sin modificaciones o es necesaria alguna modificación?

Incluso si empaqueto muchos archivos en archivos, la pregunta permanece si esto mejorará el rendimiento. Leí que incluso si empaqueté varios archivos, estos archivos dentro de un archivo no serán procesados ​​por un mapeador, sino muchos, que en mi caso (supongo) no mejorarán el rendimiento.

Si esta pregunta es demasiado simple, por favor entienda que soy novato en Hadoop y tengo muy poca experiencia con él.

Respuesta

4

El uso de HDFS no cambiará que está causando que hadoop maneje una gran cantidad de archivos pequeños. La mejor opción en este caso es probablemente cat los archivos en un único (o pocos) archivo (s). Esto reducirá la cantidad de correlacionadores que tiene, lo que reducirá la cantidad de elementos necesarios para su procesamiento.

Para usar HDFS puede mejorar el rendimiento si está operando en un sistema distribuido. Si solo está distribuyendo psuedo (una máquina), HDFS no mejorará el rendimiento. La limitación es la máquina.

Cuando está trabajando en una gran cantidad de archivos pequeños, eso requerirá una gran cantidad de correlacionadores y reductores. La configuración/disminución puede ser comparable al tiempo de procesamiento del archivo en sí, causando una gran sobrecarga. cat ing ing los archivos debería reducir la cantidad de correlacionadores que ejecuta hadoop para el trabajo, lo que debería mejorar el rendimiento.

El beneficio que podría ver al usar HDFS para almacenar los archivos sería en modo distribuido, con varias máquinas. Los archivos se almacenarían en bloques (64 MB predeterminados) en todas las máquinas y cada máquina podría procesar un bloque de datos que reside en la máquina. Esto reduce el uso del ancho de banda de la red para que no se convierta en un cuello de botella en el procesamiento.

Al archivar los archivos, si hadoop los va a desarchivar, Hardoop seguirá teniendo una gran cantidad de archivos pequeños.

Espero que esto ayude a su comprensión.

1

¿Se pueden concatenar los archivos antes de enviarlos a Hadoop?

+0

Supongo que podría, pero como puse la URL/dirección de la página en la primera línea del archivo, sería un poco difícil de reconocer si esa página es nueva, o simplemente un enlace normal a alguna otra página. – Sasa

3

De mi conocimiento aún limitado de Hadoop, creo que la solución correcta sería crear SequenceFile (s) que contenga sus archivos HTML como valores y posiblemente la URL como la clave. Si realiza un trabajo de M/R sobre el SequenceFile (s), cada asignador procesará muchos archivos (dependiendo del tamaño de división). Cada archivo se presentará a la función de mapa como una sola entrada. Es posible que desee utilizar SequenceFileAsTextInputFormat como InputFormat para leer estos archivos.

Véase también: Providing several non-textual files to a single map in Hadoop MapReduce

2

I marcado esta artículo recientemente para leerlo más tarde y encontró la misma pregunta aquí :) La entrada es un poco viejo, no muy seguro de lo relevante que es ahora.Los cambios en Hadoop están sucediendo a un ritmo muy rápido.

http://www.cloudera.com/blog/2009/02/the-small-files-problem/

La entrada del blog es por Tom White, que es también el autor de "Hadoop: La guía definitiva, segunda edición", una lectura recomendada para aquellos que se están iniciando con Hadoop.

http://oreilly.com/catalog/0636920010388

0

CombineFileInputFormat se puede utilizar en este caso, que funciona bien para grandes numaber de archivos pequeños. Esto empaqueta muchos de estos archivos en una sola división, por lo que cada asignador tiene que procesar más (1 división = 1 tarea de mapa). El tiempo de procesamiento general para mapreduce también disminuirá ya que hay menos corredores en ejecución. Como no hay ningún archivo de entrada compatible con ArchiveFormat que use CombineFileInputFormat mejorará el rendimiento.

Cuestiones relacionadas