python hadoop jython apache-pig

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



jython apache-pig (3)

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 python:

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

También tenga en cuenta que todavía obtendrá 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 finalmente se encontraron es 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 funciona realmente. .

Estoy usando Pig (0.9.1) con UDF escritas en Python. Los scripts de Python importan módulos de la biblioteca estándar de Python. He podido ejecutar las scripts de Pig que llaman a las UDF de Python con éxito en el modo local, pero cuando corro 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:

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

¿Es necesario instalar python (o jython) en cada nodo del rastreador de tareas?

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

¿Deben instalarse los módulos python (o jython) en cada nodo del rastreador de tareas?

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

¿Los nodos del rastreador de tareas necesitan saber cómo encontrar los módulos? De ser así, ¿cómo se 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 ":

register también se usa para localizar recursos para las UDF de Python que usa en sus scripts de Pig Latin. En este caso, no registra un jar, sino un script de Python que contiene su UDF. La secuencia de comandos de Python debe estar en su directorio actual.

Y también este es importante:

Una advertencia, Pig no rastrea 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 residen en los nodos de tareas de su clúster y que la variable de entorno PYTHONPATH está configurada en esos nodos de manera que sus UDF puedan encontrarlos para la importación. Este problema se ha corregido después de 0.9, pero a partir de este escrito aún no se ha publicado.

Y si estás usando jython:

Pig no sabe en qué parte de tu sistema está el intérprete Jython, por lo que debes incluir jython.jar en tu classpath al invocar Pig. Esto puede hacerse configurando la variable de entorno PIG_CLASSPATH.

A modo de resumen, si está utilizando la transmisión, puede usar el comando "ENVIAR" en pig, que enviaría sus archivos ejecutables al clúster. si está utilizando UDF, siempre que pueda compilarse (consulte la nota sobre jython) y no tenga dependencia de terceros (que no haya puesto ya en PYTHONPATH / o instalado en el clúster), el UDF lo haría ser enviado al clúster cuando se ejecuta. (Como consejo, haría su vida mucho más fácil si coloca sus dependencias de UDF simples en la misma carpeta con script de cerdo al registrarse)

Espero que esto aclare las cosas.


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

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