我试图在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做了正确的事情:
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;
有什么建议吗?
答案 0 :(得分:0)
简短的回答是按照post on the AWS forum的描述下载,构建和使用Pig 0.11.1。一旦我这样做,Python UDF代码“就行了”。
我首先使用上面提到的下载并构建Pig 0.11.1的脚本来天真地做到这一点。我认为这可能是从头开始制造猪的过度杀伤,因为我一直在阅读Pig versions并且认为0.11.1已经可以通过--pig-versions获得。 (虽然文档没有列出0.11.1,但猪安装程序脚本确实包含它。)我使用以下命令测试使用pig-0.11.1的EMR-distro:
./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没有安装。
如果有人能够理解我做错了什么,我真的很感激。否则,我会接受下载和构建它的解决方法,因为它浪费了一点时间但确实有效。