Ben*_*ver 7 python hadoop jython apache-pig
我正在使用Pig(0.9.1)和用Python编写的UDF.Python脚本从标准Python库导入模块.我已经能够运行在本地模式下成功调用Python UDF的Pig scrips,但是当我在集群上运行时,看起来Pig生成的Hadoop作业无法找到导入的模块.需要做什么?
例如:
是否需要在每个任务跟踪器节点上安装python(或jython)?
是的,因为它是在任务跟踪器中执行的.
是否需要在每个任务跟踪器节点上安装python(或jython)模块?
如果您使用的是第三方模块,它也应该安装在任务跟踪器中(如geoip等).
任务跟踪器节点是否需要知道如何查找模块?如果是这样,您如何指定路径(通过环境变量 - 如何为任务跟踪器完成)?
作为" 编程猪 " 一书的答案:
register还用于查找您在Pig Latin脚本中使用的Python UDF的资源.在这种情况下,您不会注册jar,而是注册包含UDF的Python脚本.Python脚本必须位于当前目录中.
而这一点很重要:
需要注意的是,Pig不会跟踪Python脚本中的依赖项,并将所需的Python模块发送到您的Hadoop集群.您需要确保所需的模块驻留在集群中的任务节点上,并且在这些节点上设置PYTHONPATH环境变量,以便UDF能够找到它们以进行导入.此问题已在0.9之后修复,但截至本文撰写时尚未发布.
如果你使用jython:
Pig不知道Jython解释器在你的系统上的位置,因此在调用Pig时必须在类路径中包含jython.jar.这可以通过设置PIG_CLASSPATH环境变量来完成.
总而言之,如果您正在使用流式传输,那么您可以在pig中使用"SHIP"命令将可执行文件发送到群集.如果您正在使用UDF,只要它可以编译(查看关于jython的注释)并且没有第三方依赖(它没有放入PYTHONPATH /或安装在集群中),UDF会执行时运送到集群.(作为提示,如果您在注册时将简单的UDF依赖项与pig脚本放在同一个文件夹中,它会让您的生活更轻松)
希望这些能清楚.