Pig UDF em execução no EMR do AWS com java.lang.NoClassDefFoundError: org / apache / pig / LoadFunc
Estou desenvolvendo um aplicativo que tenta ler o arquivo de log armazenado em dólares do S3 e analisá-lo usando o Elastic MapReduce. Atual o arquivo de log tem o seguinte formato
-------------------------------
COLOR=Black
Date=1349719200
PID=23898
Program=Java
EOE
-------------------------------
COLOR=White
Date=1349719234
PID=23828
Program=Python
EOE
Então eu tento carregar o arquivo no meu script Pig, mas o Pig Loader não parece ser capaz de carregar meus dados, então eu tenho que criar meu próprio UDF. Como sou muito novo no Pig e no Hadoop, quero testar um script escrito por outros antes de escrever o meu, apenas para ter uma ideia de como o UDF funciona. Eu encontrei um daquihttp://pig.apache.org/docs/r0.10.0/udf.html, há um SimpleTextLoader. Para compilar este SimpleTextLoader, eu tenho que adicionar algumas importações, como
import java.io.IOException;
import java.util.ArrayList;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.apache.pig.data.DataByteArray;
import org.apache.pig.PigException;
import org.apache.pig.LoadFunc;
Então, descobri que preciso compilar esse arquivo. Eu tenho que baixar svn e porco correndo
sudo apt-get install subversion
svn co http://svn.apache.org/repos/asf/pig/trunk
ant
Agora eu tenho um arquivo pig.jar, então eu tento compilar este arquivo.
javac -cp ./trunk/pig.jar SimpleTextLoader.java
jar -cf SimpleTextLoader.jar SimpleTextLoader.class
Ele compila com sucesso, e eu digito Pig entrando em grunhido, em grunhido eu tento carregar o arquivo, usando
grunt> register file:/home/hadoop/myudfs.jar
grunt> raw = LOAD 's3://mys3bucket/samplelogs/applog.log' USING myudfs.SimpleTextLoader('=') AS (key:chararray, value:chararray);
2012-12-05 00:08:26,737 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc Details at logfile: /home/hadoop/pig_1354666051892.log
Dentro do pig_1354666051892.log, ele tem
Pig Stack Trace
---------------
ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc
java.lang.NoClassDefFoundError: org/apache/pig/LoadFunc
Eu também tento usar outro UDF (UPPER.java) dehttp://wiki.apache.org/pig/UDFManual, e eu ainda estou recebendo o mesmo erro, tente usar o método UPPER. Você pode por favor me ajudar, qual é o problema aqui? Muito obrigado!
ATUALIZAÇÃO: Experimentei o Pig.jar do EMR em /home/hadoop/lib/pig/pig.jar e obtenho o mesmo problema.