在 Amazon EMR 上为 Pig UDF 加载外部 python 模块

Posted

技术标签:

【中文标题】在 Amazon EMR 上为 Pig UDF 加载外部 python 模块【英文标题】:Loading external python modules for Pig UDFs on Amazon EMR 【发布时间】:2012-06-08 18:18:19 【问题描述】:

我创建了一个 python UDF 来将日期时间转换为不同的时区。该脚本使用不随 python(或 jython)一起提供的 pytz。我尝试了几件事:

    引导 PIG 安装它自己的 jython 并将 pytz 包含在 那个 jython 安装。我无法让 PIG 使用新安装的 jython,它不断恢复为亚马逊的 jython。 将 PYTHONPATH 设置为安装了新模块的本地目录 将 HADOOP_CLASSPATH/PIG_CLASSPATH 设置为新安装的 jython

当我尝试加载 UDF 脚本时,每一个都以“ImportError: No module named pytz”结束。如果我删除 pytz,脚本加载正常,所以肯定是外部模块给它带来了问题。

编辑:最初将此作为评论,但我认为我只是将其作为编辑:

我已经尝试了所有我知道的方法来让 PIG 识别另一个 jython jar。那没有奏效。亚马逊的 jython 在这里:/home/hadoop/.versions/pig-0.9.2/lib/pig/jython.jar,正在识别这个 sys.path:/home/hadoop/lib/Lib。我不知道如何针对这个 jar 构建外部库。

【问题讨论】:

***.com/questions/6811549/… 可能对您有所帮助(他们正在尝试加载不同的模块,但方法应该相同) 或***.com/questions/8129543/… 是的,我尝试将包引导到每个从站。它有效,但问题是我无法让 PIG 使用我安装的 jython jar。相反,它总是选择没有安装任何外部库的 Amazon 的 jython jar。 我猜运行时解析的类路径在你的前面有他们的 jython jar - 你能修改 hadoop-env.sh 文件吗? (我没有使用 EMR,抱歉) 我还没有尝试过,但我已经直接在调用 pig 可执行文件的行上分配了 HADOOP_CLASSPATH 和 PIG_CLASSPATH,如下所示:***.com/questions/9300509 【参考方案1】:

您可以手动破解 jython 脚本中的 sys.path 吗?

【讨论】:

我可以尝试,但我认为 jython jar 是由 Hadoop 加载的。由于我会将路径切换到不是针对加载的 jython jar 构建的库,因此我不确定这是否可行。不过我会试试看。 我将新的 jython jar 路径附加到 sys.path 列表中,但它仍然抱怨找不到模块。 你能从你的 UDF 脚本中打印出 sys.path 吗?我想知道您是否破解了 PYTHONPATH 以包含一个包含 pytz 的目录,该目录是否实际上将其放入 sys.path,或者 hadoop 是否正在覆盖它。如果它被覆盖,那么也许您可以从脚本手动将目录添加到 sys.path,而不是添加特殊的 jython jar。 这是有希望的。从加载的 UDF 打印 sys.path 时,我发现了这个路径(/home/hadoop/.versions/0.20.205/libexec/../share/hadoop/lib/jython.jar/Lib)。我将尝试针对这个 jython 进行引导。

以上是关于在 Amazon EMR 上为 Pig UDF 加载外部 python 模块的主要内容,如果未能解决你的问题,请参考以下文章

从 Pig UDF Java 类、Amazon EMR 中的分布式缓存访问文件

在 Amazon EMR-4 上的 Tez 上运行 Pig

使用 java.lang.NoClassDefFoundError 在 AWS EMR 上运行 Pig UDF:org/apache/pig/LoadFunc

amazon emr pig:使用参数文件

在 Amazon EMR 中运行的 Pig 作业的引导文件的路径是啥

Pig 脚本无法使用 Amazon EMR