Pig UDF se ejecuta en AWS EMR con java.lang.NoClassDefFoundError: org / apache / pig / LoadFunc
Estoy desarrollando una aplicación que intenta leer el archivo de registro almacenado en bucles S3 y analizarlo utilizando Elastic MapReduce. Actual el archivo de registro tiene el siguiente formato
-------------------------------
COLOR=Black
Date=1349719200
PID=23898
Program=Java
EOE
-------------------------------
COLOR=White
Date=1349719234
PID=23828
Program=Python
EOE
Así que trato de cargar el archivo en mi script de Pig, pero el Pig Loader incorporado no parece ser capaz de cargar mis datos, así que tengo que crear mi propio UDF. Ya que soy bastante nuevo en Pig y Hadoop, quiero probar el guión que escribieron otros antes de escribir el mío, solo para ver cómo funciona el UDF. Encontré uno de aquíhttp://pig.apache.org/docs/r0.10.0/udf.html, hay un SimpleTextLoader. Para compilar este SimpleTextLoader, tengo que agregar algunas importaciones, 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;
Luego, descubrí que necesito compilar este archivo. Tengo que descargar svn y pig running
sudo apt-get install subversion
svn co http://svn.apache.org/repos/asf/pig/trunk
ant
Ahora tengo un archivo pig.jar, entonces trato de compilar este archivo.
javac -cp ./trunk/pig.jar SimpleTextLoader.java
jar -cf SimpleTextLoader.jar SimpleTextLoader.class
Se compila correctamente, y escribo en Pig entrando en gruñido, en gruñido intento cargar el archivo, 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 del pig_1354666051892.log, tiene
Pig Stack Trace
---------------
ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc
java.lang.NoClassDefFoundError: org/apache/pig/LoadFunc
También trato de utilizar otro UDF (UPPER.java) a partir dehttp://wiki.apache.org/pig/UDFManualY estoy teniendo el mismo error al intentar utilizar el método superior. ¿Me pueden ayudar, por favor, cuál es el problema aquí? ¡Muchas gracias!
ACTUALIZACIÓN: probé EMR build-in Pig.jar en /home/hadoop/lib/pig/pig.jar, y obtuve el mismo problema.