【问题标题】:pig aws emr jython serialization errorpig aws emr jython 序列化错误
【发布时间】:2013-05-29 02:48:22
【问题描述】:

我正在尝试在 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]'

我在这里和其他地方进行了搜索,看到了一些相关的问题和解决方案,但似乎没有一个解决方案适用,包括一年多前的一个 post,这似乎表明这在 Pig 0.9.1 上运行良好在 Amazon EMR 上。

$ 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;

有什么建议吗?

【问题讨论】:

  • 修复是使用 Pig 0.11.1!
  • 你在本地模式的Pig中试过这个吗?

标签: jython apache-pig emr


【解决方案1】:

简短的回答是按照post on the AWS forum 的描述下载、构建和使用 Pig 0.11.1。一旦我这样做了,Python UDF 代码就“正常工作”了。

我首先天真地使用上面引用的脚本来下载和构建 Pig 0.11.1。我认为从头开始构建 pig 可能有点矫枉过正,因为我一直在阅读更多关于 Pig versions 的内容,并相信 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-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多