Hadoop Java 错误:线程“主”java.lang.ClassNotFoundException 中的异常:com.packt.ch3.etl.ParseWeblogs
Posted
技术标签:
【中文标题】Hadoop Java 错误:线程“主”java.lang.ClassNotFoundException 中的异常:com.packt.ch3.etl.ParseWeblogs【英文标题】:Hadoop Java Error : Exception in thread "main" java.lang.ClassNotFoundException: com.packt.ch3.etl.ParseWeblogs 【发布时间】:2015-12-10 02:12:49 【问题描述】:我是 Hadoop 新手。我遵循了一些教程并尝试在我的 2.7.0 版本的 hadoop 集群中运行该示例,不幸的是,我得到了如下错误:
$ javac *.java
$ jar cvf myjar.jar *.class
$ hadoop jar ./myjar.jar com.packt.ch3.etl.ParseWeblogs /user/hadoop/apache_clf.txt /user/hadoop/apache_clf_tsv
Exception in thread "main" java.lang.ClassNotFoundException: com.packt.ch3.etl.ParseWeblogs
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
我的类路径设置如下:
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$ANT_HOME/lib/ant-launcher.jar
export CLASSPATH="/usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.0.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.0.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar:$CLASSPATH"
ParseWeblogs.java 文件的源代码如下:
package com.packt.ch3.etl;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ParseWeblogs extends Configured implements Tool
public int run(String[] args) throws Exception
Path inputPath = new Path(args[0]);
Path outputPath = new Path(args[1]);
Configuration conf = getConf();
Job weblogJob = new Job(conf, "ParseWeblogs");
//weblogJob.setJarByClass(ParseWeblogs.class);
weblogJob.setJobName("Weblog Transformer");
weblogJob.setJarByClass(getClass());
weblogJob.setNumReduceTasks(0);
weblogJob.setMapperClass(CLFMapper.class);
weblogJob.setMapOutputKeyClass(Text.class);
weblogJob.setMapOutputValueClass(Text.class);
weblogJob.setOutputKeyClass(Text.class);
weblogJob.setOutputValueClass(Text.class);
weblogJob.setInputFormatClass(TextInputFormat.class);
weblogJob.setOutputFormatClass(TextOutputFormat.class);
//weblogJob.setJarByClass(ParseWeblogs.class);
FileInputFormat.setInputPaths(weblogJob, inputPath);
FileOutputFormat.setOutputPath(weblogJob, outputPath);
if(weblogJob.waitForCompletion(true))
return 0;
return 1;
public static void main( String[] args ) throws Exception
int returnCode = ToolRunner.run(new ParseWeblogs(), args);
System.exit(returnCode);
++++++++++++++++++++++++++++++++++++++++
文件CLFMapper.java的源代码如下:
package com.packt.ch3.etl;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class CLFMapper extends Mapper<Object, Text, Text, Text>
private SimpleDateFormat dateFormatter =
new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z");
private Pattern p = Pattern.compile("^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d4)\\] \"(\\w+) (.+?) (.+?)\" (\\d+) (\\d+) \"([^\"]+|(.+?))\" \"([^\"]+|(.+?))\"", Pattern.DOTALL);
private Text outputKey = new Text();
private Text outputValue = new Text();
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException
String entry = value.toString();
Matcher m = p.matcher(entry);
if (!m.matches())
return;
Date date = null;
try
date = dateFormatter.parse(m.group(4));
catch (ParseException ex)
return;
outputKey.set(m.group(1)); //ip
StringBuilder b = new StringBuilder();
b.append(date.getTime()); //timestamp
b.append('\t');
b.append(m.group(6)); //page
b.append('\t');
b.append(m.group(8)); //http status
b.append('\t');
b.append(m.group(9)); //bytes
b.append('\t');
b.append(m.group(12)); //useragent
outputValue.set(b.toString());
context.write(outputKey, outputValue);
谁能帮帮我,我尝试了几种解决方案,但还没有弄清楚。非常感谢!
【问题讨论】:
当然你在类路径/构建路径中没有依赖。它还有助于添加您尝试过的信息和问题。 我执行的程序如下: $ export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$ ANT_HOME/lib/ant-launcher.jar;export CLASSPATH="/usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.0.jar:/usr/local/hadoop/share/hadoop/mapreduce/ hadoop-mapreduce-client-core-2.7.0.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar:$CLASSPATH" $ javac *.java;jar cvf myjar. jar *.class;hadoop jar ./myjar.jar com.packt.ch3.etl.ParseWeblogs /user/hadoop/apache_clf.txt /user/hadoop/apache_clf_tsv 我得到了前面提到的错误,但 WordCount 有效 @rocky :我怀疑你的 jar 是否没有正确创建,因为 wordcount 工作正常。 @rocky:您创建代码的位置。蚀?如果 eclipse 从那里自己创建 jar @Unmesha SreeVeni:我使用 linux 命令创建了我的 jar,例如 javac 和 jar 命令,而不是之前提到的 eclipse,请参阅我之前的描述,谢谢。 【参考方案1】:你能试试这个Driver类吗? 我做了一些编辑。 让我们看看它是否有效。
package trail;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
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.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ParseWeblogs extends Configured implements Tool
/**
* @param args
* @throws Exception
*/
public static void main(String[] args)
// TODO Auto-generated method stub
Configuration conf = new Configuration();
try
int res = ToolRunner.run(conf, new ParseWeblogs(), args);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
public int run(String[] args)
// TODO Auto-generated method stub
Configuration conf = new Configuration();
/*
* Arguments
*/
String source = args[0];
String dest = args[1];
FileSystem fs = null;
try
fs = FileSystem.get(conf);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
Path in = new Path(source);
Path out = new Path(dest);
Job weblogJob = null;
try
weblogJob = new Job(conf, "ParseWeblogs");
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
weblogJob.setJarByClass(ParseWeblogs.class);
weblogJob.setMapperClass(CLFMapper.class);
weblogJob.setMapOutputKeyClass(Text.class);
weblogJob.setMapOutputValueClass(Text.class);
weblogJob.setOutputKeyClass(Text.class);
weblogJob.setOutputValueClass(Text.class);
try
TextInputFormat.addInputPath(weblogJob, in);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
/*
* Delete output dir if exist
*/
try
if (fs.exists(out))
fs.delete(out, true);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
TextOutputFormat.setOutputPath(weblogJob, out);
boolean success = false ;
try
success = weblogJob.waitForCompletion(true);
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
return success ?0:1;
【讨论】:
它不起作用。 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 处的 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 处的线程“main”中的异常 java.lang.ClassNotFoundException: com.packt.ch3.etl.ParseWeblogs ) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 java.lang.Class.forName0(Native Method) 在 java.lang.Class.forName(Class.java:348) 在 org.apache.hadoop。 org.apache.hadoop.util.RunJar.main(RunJar.java:136) 处的 util.RunJar.run(RunJar.java:214) :(为什么会这样。好吧,让我在我的集群中运行 非常感谢,您能稍后告诉我结果吗?提前致谢。 其他名称..尝试将您的包裹重命名为 trail 或其他名称..Naming convention 是的,明白了!我删除了包,它可以工作。所以我在java中徘徊包的优势和用法。您能否解释一下或提供一些有用的参考资料?非常感谢!以上是关于Hadoop Java 错误:线程“主”java.lang.ClassNotFoundException 中的异常:com.packt.ch3.etl.ParseWeblogs的主要内容,如果未能解决你的问题,请参考以下文章
运行 HIVE 命令抛出错误:线程“主”java.lang.RuntimeException 中的异常:org.apache.hadoop.hive.ql.metadata.HiveException
HCatalog:线程“主”java.lang.IncompatibleClassChangeError 中的异常
int 错误:线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间