2012-06-04 59 views
3

我创建了一个python UDF来将日期时间转换为不同的时区。该脚本使用python(或者jython)不附带。我试了两件事情:在亚马逊EMR上为Pig UDF加载外部python模块

  1. 自举PIG安装它自己的Jython和包括 是Jython安装pytz。我无法让PIG使用新安装的jython ,它仍然会恢复到Amazon的jython。
  2. 设置PYTHONPATH到新的模块已安装
  3. 设置HADOOP_CLASSPATH/PIG_CLASSPATH到Jython的一个新安装的本地目录

每一种与结束“导入错误:没有模块名为pytz”时我尝试加载UDF脚本。如果我删除pytz,脚本加载得很好,所以它肯定是给它带来问题的外部模块。

编辑:最初把这个作为一个评论,但我觉得还是让编辑:

我已经想尽办法,我知道的获得PIG承认另一Jython的罐子。这没有奏效。亚马逊的jython在这里:/home/hadoop/.versions/pig-0.9.2/lib/pig/jython.jar,并认识到这个sys.path:/ home/hadoop/lib/Lib。我无法弄清楚如何针对这个jar构建外部库。

+0

http://stackoverflow.com/questions/6811549/how-can-i-include-a-python-package-with-hadoop-streaming-job/6811775#6811775可能会帮助你(他们正试图加载不同的模块,但该方法应该是相同的) –

+0

或http://stackoverflow.com/questions/8129543/hadoop-streaming-importing-modules-on-emr –

+0

是的,我试着引导包到每个奴隶。它的工作,但问题是,我不能让PIG使用我已经安装的jython jar。相反,它总是选择Amazon没有安装任何外部库的jython jar。 –

回答

0

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

+0

我可以尝试,但我认为jython jar是由Hadoop加载的。由于我将路径切换到不是针对加载的jython jar构建的库,我不确定这是否可行。我会尝试一下。 –

+0

我将新的jython jar路径附加到sys.path列表中,但仍然抱怨找不到该模块。 –

+0

你能够从你的UDF脚本打印sys.path吗?我想知道你是否破解了PYTHONPATH以包含一个包含pytz的目录,如果该目录实际上将其放入sys.path中,或者如果hadoop覆盖它。如果它被覆盖,那么也许你可以从你的脚本手动添加一个目录到sys.path,而不是添加你特殊的jython jar。 – mhawthorne