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

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

  1. 引导 PIG 安装它自己的 jython 并将 pytz 包含在 那个 jython 安装。我无法让 PIG 使用新安装的 jython,它不断恢复为亚马逊的 jython。
  2. 将 PYTHONPATH 设置为安装了新模块的本地目录
  3. 将 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 构建外部库。

【问题讨论】:

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

标签: python amazon apache-pig emr


【解决方案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 进行引导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2013-05-31
相关资源
最近更新 更多