UDF Pig работает в AWS EMR с java.lang.NoClassDefFoundError: org / apache / pig / LoadFunc
Я разрабатываю приложение, которое пытается прочитать файл журнала, хранящийся в долларах S3, и проанализировать его с помощью Elastic MapReduce. Текущий файл журнала имеет следующий формат
-------------------------------
COLOR=Black
Date=1349719200
PID=23898
Program=Java
EOE
-------------------------------
COLOR=White
Date=1349719234
PID=23828
Program=Python
EOE
Поэтому я пытаюсь загрузить файл в мой скрипт Pig, но встроенный Pig Loader неКажется, я не могу загрузить свои данные, поэтому я должен создать свой собственный UDF. Поскольку я довольно новичок в Pig и Hadoop, я хочу попробовать сценарий, написанный другими, прежде чем писать свой собственный, просто чтобы узнать, как работает UDF. Я нашел один отсюдаhttp://pig.apache.org/docs/r0.10.0/udf.htmlесть SimpleTextLoader. Чтобы скомпилировать этот SimpleTextLoader, я должен добавить несколько импортов, так как
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;
Затем я узнал, что мне нужно скомпилировать этот файл. Я должен скачать SVN и свинья работает
sudo apt-get install subversion
svn co http://svn.apache.org/repos/asf/pig/trunk
ant
Теперь у меня есть файл pig.jar, затем я пытаюсь скомпилировать этот файл.
javac -cp ./trunk/pig.jar SimpleTextLoader.java
jar -cf SimpleTextLoader.jar SimpleTextLoader.class
Он компилируется успешно, и я набираю в Pig ввод grunt, в grunt я пытаюсь загрузить файл, используя
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
Внутри pig_1354666051892.log, он имеет
Pig Stack Trace
---------------
ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc
java.lang.NoClassDefFoundError: org/apache/pig/LoadFunc
Я также пытаюсь использовать другой UDF (UPPER.java) изhttp://wiki.apache.org/pig/UDFManual, и я все еще получаю ту же ошибку при попытке использовать метод UPPER. Можете ли вы помочь мне, чтопроблема здесь? Большое спасибо!
ОБНОВЛЕНИЕ: я попробовал встроить Pig.jar в EMR в /home/hadoop/lib/pig/pig.jar, и получил ту же проблему.