Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pig中使用Python UDF时,如何让Hadoop查找导入的Python模块?_Python_Hadoop_Jython_Apache Pig - Fatal编程技术网

在Pig中使用Python UDF时,如何让Hadoop查找导入的Python模块?

在Pig中使用Python UDF时,如何让Hadoop查找导入的Python模块?,python,hadoop,jython,apache-pig,Python,Hadoop,Jython,Apache Pig,我正在使用Pig(0.9.1)和用Python编写的UDF。Python脚本从标准Python库导入模块。我已经能够在本地模式下成功运行调用Python UDF的Pig脚本,但是当我在集群上运行时,Pig生成的Hadoop作业似乎无法找到导入的模块。需要做什么 例如: 是否需要在每个任务跟踪器节点上安装python(或jython) python(或jython)模块是否需要安装在每个任务跟踪器节点上 任务跟踪器节点是否需要知道如何查找模块 如果是,您如何指定路径(通过环境变量-如何为任务跟踪

我正在使用Pig(0.9.1)和用Python编写的UDF。Python脚本从标准Python库导入模块。我已经能够在本地模式下成功运行调用Python UDF的Pig脚本,但是当我在集群上运行时,Pig生成的Hadoop作业似乎无法找到导入的模块。需要做什么

例如:

  • 是否需要在每个任务跟踪器节点上安装python(或jython)
  • python(或jython)模块是否需要安装在每个任务跟踪器节点上
  • 任务跟踪器节点是否需要知道如何查找模块
  • 如果是,您如何指定路径(通过环境变量-如何为任务跟踪器指定路径)
每个任务跟踪器上是否需要安装python(或jython) 节点

是的,因为它是在任务跟踪器中执行的

每个任务都需要安装python(或jython)模块吗 跟踪节点

如果您使用的是第三方模块,那么它也应该安装在任务跟踪器中(如geoip等)

任务跟踪器节点是否需要知道如何查找模块? 如果是,如何指定路径(通过环境变量-how) 任务跟踪器完成了吗

作为书中的回答:

register还用于定位您使用的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脚本放在同一个文件夹中,会使您的生活更加轻松)


希望这些都能澄清问题。

我在使用Hadoop 1.2.1和Pig 0.11.1时遇到了同样的问题,并从中找到了一个解决方法,那就是在我的Pig参数中添加
-Dmapred.child.env=“JYTHONPATH=job.jar/Lib”
。例如:

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

pig -Dmapred.child.env="JYTHONPATH=job.jar/Lib" script.pig
工作。请注意,您还可以将以下行添加到python脚本中:

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

还请注意,您仍然会收到大量“未找到模块”警告,但修复程序仍然有效。尽管模块最终被发现,但您仍然收到这些警告,这让我感到难以置信的困惑,我总是在hadoop作业正确返回之前杀死它,认为这是修复程序无法实际工作的症状…

@dksahuji:Pig启动map reduce作业时,它将所需的所有类和文件放入一个job.jar文件中,该文件被发送到所有MR任务。但通常情况下,它与jobxxxxxx.jar类似,其中xxxxx发生了更改。单个pig脚本启动多个jobxxxxx.jar文件。