0

我正在尝试在 Amazon EMR 上的 Pig 中运行一个简单的 Python UDF,它会引发 java 序列化错误:

java.io.IOException: Deserialization error: could not instantiate 'org.apache.pig.scripting.jython.JythonFunction' with arguments '[/tmp/pig4877832484731242596tmp/simple.py, aprs]'

我在这里和其他地方进行了搜索,看到了一些相关的问题和解决方案,但似乎没有一个解决方案适用,包括一年多前的一篇文章似乎表明这在 Amazon EMR 上与 Pig 0.9.1 一起工作正常。

$ pig --version
Apache Pig version 0.9.2-amzn (rexported)
compiled Aug 06 2012, 20:34:29
$ hadoop version
Hadoop 1.0.3

这是我的琐碎 python UDF:

#/usr/bin/python                                                                                          
@outputSchema("data:chararray")
def aprs(l):
  return l

这是显示 UDF 已加载且 @outputSchema 做了正确的事情的 pig 脚本调用:

grunt> Register 's3n://n2ygk/simple.py' using jython as myudf;
grunt> raw = LOAD 's3n://aprs-is/small-sample.log' USING TextLoader as (line:chararray);
grunt> cooked = LIMIT raw 1000;
grunt> aprs = FOREACH cooked GENERATE FLATTEN(myudf.aprs(line));
grunt> DESCRIBE aprs;
aprs: {data: chararray}
grunt> dump aprs;

有什么建议么?

4

1 回答 1

0

简短的回答是下载、构建和使用 Pig 0.11.1,如AWS 论坛上的这篇文章所述。一旦我这样做了,Python UDF 代码就“正常工作”。

我首先通过使用下载和构建 Pig 0.11.1 的上述脚本天真地做到了这一点。我认为从头开始构建 pig 可能有点矫枉过正,因为我一直在阅读更多关于 Pig版本的内容,并相信 0.11.1 已经可以通过 --pig-versions 获得。(虽然文档没有列出 0.11.1,但 pig 安装程序脚本确实包含它。)我使用以下命令来测试使用 pig-0.11.1 的 EMR 发行版:

./elastic-mapreduce --create --name 'Pig11 2013-06-03-21:35:24' --alive \
--num-instances 1 --instance-type m1.small --pig-interactive \
--pig-versions 0.11.1 \
--bootstrap-action s3n://us-west-2.elasticmapreduce/bootstrap-actions/configurations/latest/memory-intensive \
--bootstrap-name 'memory intensive'

不幸的是,这会引发以下错误,这似乎与 java 1.6 版和 1.7 版有关:

hadoop@ip-10-253-41-55:~$ pig
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/pig/Main :    Unsupported major.minor version 51.0
      at java.lang.ClassLoader.defineClass1(Native Method)
      at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
      at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
      at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
      at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
      at java.lang.Class.forName0(Native Method)
      at java.lang.Class.forName(Class.java:247)
      at org.apache.hadoop.util.RunJar.main(RunJar.java:180)
hadoop@ip-10-253-41-55:~$ hadoop version
Hadoop 1.0.3

当我在没有指定的情况下重新测试上述--pig-versions 0.11.1内容时,结果发现只安装了 0.9.2 以响应--pig-versions latest.

我从 (s3://us-west-2.elasticmapreduce/libs/pig/pig-script) 看到 Pig 0.11.1 和 hadoop 1.0.3 需要 java 7 而 0.9.2 需要 hadoop 1.03 和 java 6。我'我猜想以某种方式没有安装java 7。

如果有人能纠正我做错了什么,我将不胜感激。否则,我将接受下载和构建它的解决方法,因为它会浪费一点时间但确实有效。

于 2013-06-04T00:57:47.530 回答