2011-04-20 9 views
6

Nuestro flujo de trabajo utiliza un clúster elástico AWS de AWS para ejecutar series de trabajos Pig para manipular una gran cantidad de datos en informes agregados. Lamentablemente, los datos de entrada son potencialmente inconsistentes, y pueden dar como resultado que no se entreguen archivos de entrada o 0 bytes a la canalización o incluso que se produzcan en algunas etapas de la canalización.¿Cómo manejas los archivos de entrada vacíos o faltantes en Apache Pig?

Durante una declaración de carga, cerdo fracasa espectacularmente si bien no encuentra ningún archivo de entrada o de cualquiera de los archivos de entrada son 0 bytes.

¿Hay alguna manera de evitar esto (con suerte dentro de la configuración o script de Pig o la configuración de clúster de Hadoop, sin escribir un cargador personalizado ...)?

(Puesto que estamos utilizando AWS mapa elástica reducir, estamos atascados con cerdo 0.6.0 y Hadoop 0.20.)

+0

Dejé de usar Pig debido a problemas como este. También es casi imposible escribir un cargador personalizado en 0.6.0 (mejoraron la API del cargador en 0.8.0). Considera usar Hive. –

Respuesta

1

(Para la posteridad, una solución por debajo del par que hemos llegado con :)

Para hacer frente al problema de 0 bytes, hemos encontrado que podemos detectar la situación y en lugar de insertar un archivo con un solo salto de línea. Esto provoca un mensaje como:

Encountered Warning ACCESSING_NON_EXISTENT_FIELD 13 time(s). 

pero al menos Pig no se bloquea con una excepción.

Alternativamente, podríamos producir una línea con el número apropiado de '\t' caracteres para ese archivo que evitaría la advertencia, pero insertaría basura en los datos que luego tendríamos que filtrar.

Estas mismas ideas se pueden usar para resolver la condición de archivos sin entrada creando un archivo ficticio, pero tiene las mismas desventajas que las enumeradas anteriormente.

1

El enfoque que he estado usando es ejecutar scripts porcinos desde un shell. Tengo un trabajo que obtiene datos de seis directorios de entrada diferentes. Así que escribí un fragmento para cada archivo de entrada.

Los controles de la cáscara para la existencia del archivo de entrada y el montaje de una secuencia de comandos cerdo final a partir de los fragmentos.

A continuación, ejecuta el último script de cerdo. Sé que es un poco un enfoque de Rube Goldberg, pero hasta ahora todo va bien. :-)

Cuestiones relacionadas