在 Jython 的 Pig UDF 中导入外部库时出现错误 1121

Posted

技术标签:

【中文标题】在 Jython 的 Pig UDF 中导入外部库时出现错误 1121【英文标题】:Error 1121 importing external library in Pig UDF in Jython 【发布时间】:2014-02-01 21:42:46 【问题描述】:

我在 jython 中使用 python 库 simplejson 编写 Pig UDF 时遇到问题。我需要,因为 jython-standalone-2.5.2.jar 没有 JSON 库。我正在使用 2013 年 9 月 3 日 20:25:46 编译的 Apache Pig 版本 0.11.0-cdh4.4.0(重新导出),并根据文档 http://pig.apache.org/docs/r0.11.1/udf.html#python-advanced“您可以在 Python 脚本中导入 Python 模块。Pig 解析 Python递归依赖,这意味着 Pig 将自动将所有依赖的 Python 模块发送到后端。Python 模块应在 jython 搜索路径中找到:JYTHON_HOME、JYTHON_PATH 或当前目录。"。所以我从https://pypi.python.org/pypi/simplejson/ 下载库,将其解压缩到我的工作目录中,然后我的脚本在本地模式下工作(使用-x local)。尽管如此,在集群模式下,我在任务跟踪器的失败日志中收到此错误:

Caused by: org.apache.pig.backend.executionengine.ExecException: ERROR 1121: Python Error. Traceback (most recent call last):
  File "ejercicio4-udfs.py", line 8, in <module>
ImportError: No module named simplejson

    at org.apache.pig.scripting.jython.JythonScriptEngine$Interpreter.execfile(JythonScriptEngine.java:231)
    at org.apache.pig.scripting.jython.JythonScriptEngine$Interpreter.init(JythonScriptEngine.java:158)
    at org.apache.pig.scripting.jython.JythonScriptEngine.getFunction(JythonScriptEngine.java:349)
    at org.apache.pig.scripting.jython.JythonFunction.<init>(JythonFunction.java:55)
    ... 92 more
Caused by: Traceback (most recent call last):
  File "ejercicio4-udfs.py", line 8, in <module>
ImportError: No module named simplejson

我尝试了几件事,例如压缩 simplejson 并注册 zip 并尝试使用 sys.path.append('simplejson.zip') 访问它,我也尝试过:

export JYTHONPATH=$JYTHONPATH:$(pwd)/simplejson.zip; pig script.pig

还有

pig -Dmapred.cache.files="simplejson.zip#simplejson.zip" -Dmapred.create.symlink=yes script.zip

【问题讨论】:

【参考方案1】:

我不知道我的回答是不是来得太晚了,但我设法在 UDF 中导入了 simplejson。

我是这样做的:

我下载了 simplejson 并将其放入 lib 文件夹,然后在我的 UDF 中我这样做了:

import sys
sys.path.append('/path/to/your/lib/folder')
import simplejson as json

然后我设法在我的集群上执行 json.loads() 没有任何问题。

希望对你有帮助

【讨论】:

以上是关于在 Jython 的 Pig UDF 中导入外部库时出现错误 1121的主要内容,如果未能解决你的问题,请参考以下文章

Pig 中 UDF 中 Jython 的限制

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

在 jython 中导入 python 模块

使用外部 Java 库的猪 UDF

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

在 Hadoop MapReduce 脚本中导入外部库