¿Cómo hago que Hadoop encuentre módulos Python importados cuando uso UDF de Python en Pig?

Estoy usando Pig (0.9.1) con UDF escritos en Python. Los scripts de Python importan módulos de la biblioteca estándar de Python. He podido ejecutar los scripts de Pig que llaman a las UDF de Python con éxito en modo local, pero cuando lo ejecuto en el clúster, parece que el trabajo de Hadoop generado por Pig no puede encontrar los módulos importados. ¿Lo que hay que hacer?

Por ejemplo:

  • ¿Python (o jython) se debe instalar en cada nodo de seguimiento de tareas?
  • ¿Es necesario instalar los módulos python (o jython) en cada nodo de seguimiento de tareas?
  • ¿Los nodos de seguimiento de tareas necesitan saber cómo encontrar los módulos?
  • Si es así, ¿cómo especifica la ruta (a través de una variable de entorno, cómo se hace para el rastreador de tareas)?

¿Python (o jython) se debe instalar en cada nodo de seguimiento de tareas?

Sí, ya que se ejecuta en rastreadores de tareas.

¿Es necesario instalar los módulos python (o jython) en cada nodo de seguimiento de tareas?

Si está utilizando un módulo de terceros, también debe instalarse en los rastreadores de tareas (como geoip, etc.).

¿Los nodos de seguimiento de tareas necesitan saber cómo encontrar los módulos? Si es así, ¿cómo especifica la ruta (a través de una variable de entorno, cómo se hace para el rastreador de tareas)?

Como respuesta del libro ” Programming Pig “:

El registro también se utiliza para localizar recursos para UDF de Python que utiliza en sus scripts de Pig Latin. En este caso, no registra un jar, sino un script de Python que contiene su UDF. El script de Python debe estar en su directorio actual.

Y también este es importante:

Una advertencia, Pig no rastrea las dependencias dentro de sus scripts de Python y envía los módulos de Python necesarios a su clúster de Hadoop. Debe asegurarse de que los módulos que necesita residan en los nodos de la tarea en su grupo y que la variable de entorno PYTHONPATH esté configurada en esos nodos para que sus UDF puedan encontrarlos para importarlos. Este problema se ha solucionado después de la versión 0.9, pero aún no se ha publicado.

Y si estás usando jython:

Pig no sabe dónde está el intérprete de Jython en su sistema, por lo que debe incluir jython.jar en su classpath cuando invoque a Pig. Esto se puede hacer configurando la variable de entorno PIG_CLASSPATH.

Como resumen, si está utilizando la transmisión, puede usar el comando “SHIP” en pig que enviaría sus archivos ejecutables al clúster. Si está utilizando UDF, siempre que pueda comstackrse (verifique la nota sobre jython) y no tenga una dependencia de terceros (que no haya puesto ya en PYTHONPATH / o instalado en el grupo), el UDF ser enviado a clúster cuando se ejecuta. (Como sugerencia, haría su vida mucho más fácil si coloca sus dependencias UDF simples en la misma carpeta con el script pig al registrarse)

Espero que estas aclararan las cosas.

Añadiendo

pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig 

Trabajos. Tenga en cuenta que también puede agregar las siguientes líneas a su secuencia de comandos de python:

 import sys sys.path.append('./Lib') 

También tenga en cuenta que todavía recibirá numerosas advertencias de “módulo no encontrado”, pero la solución funciona. El hecho de que recibas estas advertencias a pesar de que los módulos no se encontraran finalmente fue increíblemente confuso para mí, y siempre maté el trabajo de Hadoop antes de que regresara correctamente, creyendo que esto es un síntoma de que la solución no está funcionando. .

Encontré el mismo problema al usar Hadoop 1.2.1 y Pig 0.11.1 y encontré una solución alternativa de PIG-2433 , que fue agregar -Dmapred.child.env="JYTHONPATH=job.jar/Lib" a mis argumentos de Pig. Ejemplo:

 pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig