2013-06-03 47 views
0

我想運行一個簡單的Python UDF豬亞馬遜EMR並拋出Java序列化錯誤:豬AWS EMR Jython的序列化錯誤

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

我在這裏和其他地方搜查,看到有些相關問題併發布瞭解決方案,但沒有一個解決方案似乎適用,其中包括一年前的一個post,似乎表明這對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 

這裏是我瑣碎蟒蛇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

修復就是使用Pig 0.11.1! – n2ygk

+1

你是否在本地模式下試過這種豬? – Eli

回答

0

簡短的答案是下載,構建和使用豬0.11.1如本post on the AWS forum所述。一旦我這樣做了,Python UDF代碼「剛剛工作」。

我首先通過使用上面提到的下載和構建Pig 0.11.1的腳本來做到這一點。我認爲這可能是過度的從頭開始建設豬,因爲我一直在閱讀Pig versions的更多信息,並且相信0.11.1已經可以通過--pig-versions獲得。 (雖然文檔沒有列出0.11.1,豬安裝腳本則包括。)我用以下命令,使用豬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以下錯誤:當我重新測試上述不指定--pig-versions 0.11.1事實證明,只有0.9.2安裝響應默認

[email protected]:~$ 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) 
[email protected]:~$ hadoop version 
Hadoop 1.0.3 

值爲--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沒有安裝。

如果有人能讓我知道我做錯了什麼,我會非常感激。否則,我會接受下載和構建它的解決方法,因爲它浪費了一點時間,但確實有效。