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

Posted

技术标签:

【中文标题】在 Pig 中使用 Python UDF 时,如何让 Hadoop 查找导入的 Python 模块?【英文标题】:How do I make Hadoop find imported Python modules when using Python UDFs in Pig? 【发布时间】:2011-10-20 05:47:42 【问题描述】:

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

例如:

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

【问题讨论】:

【参考方案1】:

是否需要在每个任务跟踪器上安装 python(或 jython) 节点?

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

是否需要在每个任务上安装 python(或 jython)模块 跟踪节点?

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

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

作为“Programming Pig”一书中的答案:

register 还用于定位您使用的 Python UDF 的资源 在您的 Pig 拉丁文脚本中。在这种情况下,您不注册 jar,但 而是一个包含您的 UDF 的 Python 脚本。 Python 脚本必须 在当前目录中。

这也很重要:

需要注意的是,Pig 不会跟踪 Python 脚本中的依赖关系 并将所需的 Python 模块发送到您的 Hadoop 集群。你是 需要确保您需要的模块驻留在任务节点上 您的集群并且 PYTHONPATH 环境变量已设置为 这些节点,以便您的 UDF 能够找到它们以进行导入。 此问题已在 0.9 之后修复,但截至撰写本文时尚未 发布。

如果您使用的是 jython :

Pig 不知道 Jython 解释器在您系统的哪个位置,所以 调用 Pig 时,您必须在类路径中包含 jython.jar。这 可以通过设置 PIG_CLASSPATH 环境变量来完成。

总而言之,如果您使用流式传输,那么您可以在 pig 中使用“SHIP”命令,它将您的可执行文件发送到集群。如果您使用的是 UDF,只要它可以被编译(检查关于 jython 的注释)并且其中没有第 3 方依赖项(您尚未放入 PYTHONPATH / 或安装在集群中),UDF 会执行时被运送到集群。 (作为提示,如果您在注册时将简单的 UDF 依赖项与 pig 脚本放在同一个文件夹中,这将使您的生活更轻松)

希望这些能解决问题。

【讨论】:

【参考方案2】:

添加

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

有效。请注意,您还可以在 python 脚本中添加以下行:

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

另外请注意,您仍然会收到大量“未找到模块”警告,但修复工作有效。即使最终发现模块,您也会收到这些警告,这让我非常困惑,而且我总是在 hadoop 作业正确返回之前将其终止,认为这是修复程序实际上不起作用的症状。 .

【讨论】:

【参考方案3】:

我在使用 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

【讨论】:

@dksahuji:当 Pig 启动 map-reduce 作业时,它会将所需的所有类和文件放在一个 job.jar 文件中,该文件会发送到所有 MR 任务。 但通常它就像 jobxxxxxx.jar 一样,其中 xxxxx 发生了变化。一个 pig 脚本启动多个 jobxxxx.jar 文件。

以上是关于在 Pig 中使用 Python UDF 时,如何让 Hadoop 查找导入的 Python 模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Pig 中的 Python UDF 打印?

对于 Apache Pig,如何在 python 中编写 Load UDF

Apache Pig - 如何维护一个分布式查找表以供我的 python UDF 访问?

在 Pig 中将关系传递给 Python UDF 时出错

Pig如何实例化UDF对象

在 pig 中进行标记(使用 python udf)