2013-06-03 2 views
0

Я пытаюсь запустить тривиальный Python UDF в Свинье на Amazon EMR и бросает ошибку сериализации:свинья AWS ОГО Jython ошибки сериализация

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 

Вот мой тривиальным питон 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.11.1! – n2ygk

+1

Вы пробовали это в Pig в локальном режиме? – Eli

ответ

0

Короткий ответ заключается в загрузке, сборке и использовании Свинья 0.11.1, как описано с этим post on the AWS forum. Как только я это сделал, код UDF Python «просто сработал».

Вначале я сделал это наивно, используя вышеприведенный скрипт, который загружает и создает Pig 0.11.1. Я предположил, что это, вероятно, слишком велико, чтобы создать свиньи с нуля, так как я читал больше на Pig versions и считаю, что 0.11.1 уже доступен через --pig-версии. (Хотя документ не перечисляет 0.11.1, скрипт инсталлятора свиньи делает его включить.) Я использовал следующую команду, чтобы проверить с помощью ОГО-дистрибутива передельного 0.11.1:

./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:

[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 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 не установился.

Если кто-то может выправить меня из-за того, что я делаю неправильно, я бы очень признателен. В противном случае, я буду жить с обходным способом загрузки и создания его, поскольку он тратит немного времени, но работает.