pig aws emr jython序列化错误

ttygqcqt  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(413)

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

我在这里和其他地方搜索过,看到了一些相关的问题和解决方案,但是没有一个解决方案是适用的,包括一年前的一篇文章,似乎表明pig0.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自定义项:


# /usr/bin/python

@outputSchema("data:chararray")
def aprs(l):
  return l

下面是pig脚本调用,它显示udf已加载,@outputschema做了正确的事情:

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;

有什么建议吗?

j2datikz

j2datikz1#

简单的回答是下载、构建和使用pig0.11.1,如aws论坛上的这篇文章所述。一旦我这么做了,python udf代码“刚刚工作”。
我首先天真地使用上面引用的脚本来下载并构建pig0.11.1。我认为这对于从头开始构建pig来说可能是过度的,因为我已经阅读了更多关于pig版本的内容,并且相信0.11.1已经可以通过pig版本获得了(虽然文档没有列出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)中看到,pig0.11.1和hadoop1.0.3需要java7,而0.9.2需要hadoop1.03和java6。我猜java7没有被安装。
如果有人能纠正我的错误,我会非常感激的。否则,我将接受下载和构建它的解决方案,因为它会浪费一点时间,但确实有效。

相关问题