datos 'trozos' de Hadoop en bloques de un tamaño configurado. El valor predeterminado es 64 MB bloques. Puede ver dónde esto causa problemas para su enfoque; Cada mapeador puede obtener solo una parte de un archivo. Si el archivo tiene menos de 64 MB (o el valor que se configure), cada asignador obtendrá solo 1 archivo.
He tenido una restricción muy similar; Necesitaba un conjunto de archivos (salida del reductor anterior en la cadena) para ser procesados por un solo mapeador. Uso el hecho de < 64MB en mi solución El objetivo principal de mi solución es que lo configuré para proporcionarle al mapeador el nombre de archivo que necesitaba para procesarlo, y el mapeador interno lo cargó/leyó el archivo. Esto permite que un solo mapeador procese un archivo completo. No se trata de un proceso distribuido del archivo, pero con la restricción de "No quiero que se distribuyan archivos individuales", funciona. :)
Tuve el proceso que inició mi MR escribir los nombres de archivo de los archivos para procesar en archivos individuales. Donde esos archivos fueron escritos fue el directorio de entrada. Como cada archivo es < 64MB, se generará un único asignador para cada archivo. El proceso map
se llamará exactamente una vez (ya que solo hay 1 entrada en el archivo).
Luego tomo el valor pasado al mapeador y puedo abrir el archivo y hacer cualquier asignación que necesite hacer. Dado que hadoop intenta ser inteligente acerca de cómo se correlacionan/reducen los procesos, puede ser necesario especificar el número de reductores que se utilizarán para que cada asignador se dirija a un solo reductor. Esto se puede establecer a través de la configuración mapred.reduce.tasks
. Lo hago a través de job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);
Mi proceso tenía algunos requisitos/restricciones adicionales que pueden haber hecho atractiva esta solución específica; pero para un ejemplo de 1: en 1: afuera; Lo he hecho, y los fundamentos están establecidos arriba.
HTH
gracias, creo que es la mejor idea. Tal vez usaré la antigua API porque parece más fácil de manejar, pero primero echaré un vistazo a 0.20 – spooky