我正在开发一个应用程序,它尝试读取存储在 S3 bucks 中的日志文件并使用 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 和 pig running
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
我还尝试使用来自http://wiki.apache.org/pig/UDFManual的另一个 UDF (UPPER.java) ,但尝试使用 UPPER 方法仍然会出现相同的错误。你能帮帮我吗,这里有什么问题吗?非常感谢!
更新:我确实在 /home/hadoop/lib/pig/pig.jar 尝试了 EMR 内置 Pig.jar,并遇到了同样的问题。