pig udf在aws emr上运行,java.lang.noclassdeffounderror:org/apache/pig/loadfunc

w9apscun  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(416)

我正在开发一个应用程序,尝试读取存储在s3 buck中的日志文件,并使用elasticmapreduce解析它。当前日志文件的格式如下

------------------------------- 
COLOR=Black 
Date=1349719200 
PID=23898 
Program=Java 
EOE 
------------------------------- 
COLOR=White 
Date=1349719234 
PID=23828 
Program=Python 
EOE

所以我尝试将文件加载到我的pig脚本中,但是内置的pig加载程序似乎无法加载我的数据,所以我必须创建自己的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

它编译成功了,我在grunt中输入pig,在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_.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,我仍然得到相同的错误尝试使用上限方法。你能帮帮我吗,这里有什么问题?非常感谢!
更新:我在/home/hadoop/lib/pig/pig.jar中尝试了emr build-in pig.jar,得到了相同的问题。

gt0wga4j

gt0wga4j1#

大多数hadoop生态系统工具(如pig和hive)都会在$hadoop\u home/conf/hadoop-env.sh中查找环境变量。
我通过将pig-0.13.0-h1.jar(它包含udf所需的所有类)添加到hadoop\u类路径来解决这个问题:

export HADOOP_CLASSPATH=/home/hadoop/pig-0.13.0/pig-0.13.0-h1.jar:$HADOOP_CLASSPATH

pig-0.13.0-h1.jar位于pig home目录中。

oxiaedzo

oxiaedzo2#

将udfjar放在/home/hadoop/lib/pig目录中,或者将pig-*-amzn.jar文件复制到/home/hadoop/lib,它就可以工作了。
您可能会使用引导操作来执行这两个操作之一。

相关问题