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

3
我创建了一个Python UDF,用于将日期时间转换为不同的时区。该脚本使用pytz,但它不随Python(或Jython)一起提供。我尝试了几件事情:
  1. 引导PIG安装自己的jython并在其中包含pytz。我无法让PIG使用新安装的jython,它始终会恢复到Amazon的jython。
  2. 将PYTHONPATH设置为已安装新模块的本地目录
  3. 将HADOOP_CLASSPATH / PIG_CLASSPATH设置为新安装的jython
每次尝试都会出现“ImportError:找不到名为pytz的模块”的错误,当我尝试加载UDF脚本时。如果我删除pytz,脚本就可以正常加载,因此肯定是外部模块引起了问题。
编辑:最初将其作为评论发布,但我想将其作为编辑。

我已经尝试了我所知道的所有方法,以使PIG能够识别另一个jython jar。但是都没有成功。亚马逊的jython在这里:/home/hadoop/.versions/pig-0.9.2/lib/pig/jython.jar,它识别了这个sys.path:/home/hadoop/lib/Lib。我无法弄清楚如何针对此jar构建外部库。


这篇文章可能会对你有所帮助(他们试图加载不同的模块,但方法应该是相同的):https://dev59.com/RWw15IYBdhLWcg3wIYO_#6811775 - Chris White
或者 https://dev59.com/a13Ua4cB1Zd3GeqP-jsm - Chris White
是的,我尝试过将软件包引导到每个从节点。虽然它可以工作,但问题在于我无法让 PIG 使用我安装的 jython jar。相反,它总是选择亚马逊的 jython jar,而这个 jar 没有安装任何外部库。 - Bob Briski
我猜运行时解析的类路径中有他们的Jython jar在你的前面 - 你能修改hadoop-env.sh文件吗?(抱歉,我没有使用过EMR) - Chris White
我还没有尝试过,但是我已经直接在调用pig可执行文件的行上分配了HADOOP_CLASSPATH和PIG_CLASSPATH,就像这样:https://dev59.com/EGDVa4cB1Zd3GeqPdnru - Bob Briski
显示剩余4条评论
1个回答

0

你能在你的Jython脚本中手动修改sys.path吗?


我可以尝试,但我认为jython jar是由Hadoop加载的。由于我将切换到一个没有针对已加载的jython jar构建的库的路径,所以我不确定是否会起作用。不过我会试一下。 - Bob Briski
我将新的 jython jar 路径添加到 sys.path 列表中,但它仍然抱怨找不到模块。 - Bob Briski
你能从你的UDF脚本中打印出sys.path吗?我想知道如果你对PYTHONPATH进行了一些修改,包括一个包含pytz的目录,这个目录是否真的进入了sys.path,或者hadoop是否覆盖了它。如果被覆盖了,那么也许你可以手动从脚本中添加一个目录到sys.path,而不是添加你特殊的jython jar。 - mhawthorne
这很有前途。当我从已加载的UDF中打印sys.path时,我发现了这条路径(/home/hadoop/.versions/0.20.205/libexec/../share/hadoop/lib/jython.jar/Lib)。我将尝试使用这个jython进行引导。 - Bob Briski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接