我正在使用Pig(0.9.1)和用Python编写的UDF。 Python脚本从标准Python库导入模块。我已经能够运行在本地模式下成功调用Python UDF的Pig scrips,但是当我在集群上运行时,看起来Pig生成的Hadoop作业无法找到导入的模块。需要做什么?
例如:
答案 0 :(得分:6)
是否需要在每个任务跟踪器上安装python(或jython) 节点
是的,因为它是在任务跟踪器中执行的。
是否需要在每个任务上安装python(或jython)模块 跟踪节点?
如果您使用的是第三方模块,它也应该安装在任务跟踪器中(如geoip等)。
任务跟踪器节点是否需要知道如何查找模块? 如果是这样,你如何指定路径(通过环境变量 - 如何 这是为任务跟踪器完成的吗?
作为“Programming Pig”一书的答案:
register也用于查找您使用的Python UDF的资源 在你的Pig Latin脚本中。在这种情况下,您不会注册jar,但是 而是一个包含UDF的Python脚本。 Python脚本必须 在你当前的目录中。
这一点也很重要:
警告,Pig不会跟踪Python脚本中的依赖项 并将所需的Python模块发送到您的Hadoop集群。你是 需要确保您需要的模块驻留在任务节点上 您的群集以及PYTHONPATH环境变量已设置为on 这些节点使您的UDF能够找到它们以便导入。 这个问题在0.9之后已经修复,但截至本文撰写时尚未确定 释放。
如果您使用的是jython:
Pig不知道Jython解释器在你的系统上的位置,所以 调用Pig时,必须在类路径中包含jython.jar。这个 可以通过设置PIG_CLASSPATH环境变量来完成。
总结一下,如果您正在使用流式传输,那么您可以在pig中使用“SHIP”命令将可执行文件发送到群集。如果您正在使用UDF,只要它可以编译(查看关于jython的注释)并且没有第三方依赖(它没有放入PYTHONPATH /或安装在集群中),UDF会执行时运送到集群。 (作为提示,如果您在注册时将简单的UDF依赖项与pig脚本放在同一个文件夹中,它将使您的生活更加轻松)
希望这些可以解决问题。
答案 1 :(得分:2)
添加
pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig
作品。请注意,您还可以将以下行添加到python脚本中:
import sys
sys.path.append('./Lib')
另请注意,您仍然会收到大量未找到的模块"警告,但修复工作。即使模块是事实发现你也会得到这些警告这一事实最终让我感到非常困惑,而且我总是在正确返回之前杀死了hadoop作业,认为这是修复工作不能正常工作的症状...
答案 2 :(得分:1)
我在使用Hadoop 1.2.1和Pig 0.11.1时遇到了同样的问题,并找到了PIG-2433的解决方法,即将-Dmapred.child.env="JYTHONPATH=job.jar/Lib"
添加到我的Pig参数中。例如:
pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig