Hadoop-2.2.0 wordcount 编译打包执行 (java.lang.ClassNotFoundException)
2014-09-12 20:50
441 查看
安装好 HADOOP+HBASE 于是开始在403准备试试好不好用然后做实验~万能的 wordcound 我来了~
-d 是指将编译好的 .class 文件存放到 ./wordcount_classes 文件夹内;
*.java 是编译的java文件对象
-encoding gdb 这个可有可无,实际上是没有写的。
这里注意后面的-C和最后的" ."(有一个空格)
整体编译和打包的情况就如下图所示了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201409/c7ebc99edd84c54c53afaa4775cbec17)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201409/b2af8a79d29e6528dd98c339da703836)
实际的运行结果应该是这个样子的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201409/aba74a7d3d282ad7f2a5221b92cae90f)
比对了使用 jar -cvf xxx.jar ./classes/* 和 jar -cvf xxx.jar -C ./classes . 生成的 jar 包,看里面包含的内容和大小都是一样一样的,很是奇怪;
本来打算去把 share/hadoop/mapreduce/sources 里面的 hadoop-mapreduce-examples-2.2.0-sources.jar 包里面的文件拿出来的,发现里面竟然都是 .java 文件唉,如下图所示~ 还好小师弟及时跑来了,一个空格一个.解决问题~还有好吃的油桃和李子(xx黑加仑?)谢谢><
1、mywordcound.java 书写
主要是从网上抄了来,据说 eclipse 不支持 hadoop-2.2.0的插件,所以不能用来编译和封包只能手写?不详。抄来的代码如下所示://must I just coding without the help of eclipse ? import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class MyWordCount{ // mapper part * public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{ private static final IntWritable one = new IntWritable(1); private Text word = new Text(); //MAP FUNCTION protected void map(Object key, Text value, Context context) throws IOException, InterruptedException{ String line = value.toString(); StringTokenizer words = new StringTokenizer(line); //split line into words while(words.hasMoreElements()){ word.set(words.nextToken()); context.write(word, one); } } } // reducer part * public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ private IntWritable totalNum = new IntWritable(); protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ int sum = 0; Iterator<IntWritable> it = values.iterator(); while(it.hasNext()){ sum += it.next().get(); } totalNum.set(sum); context.write(key, totalNum); } } // configuration part * @SuppressWarnings("deprecation") public static void main(String[] args) throws Exception{ Configuration conf = new Configuration(); //~~~commons-logging-1.1.1.jar Job job = new Job(conf, "MyWordCount"); //create a job ~~~ /hadoop/yarn/lib/log4j-1.2.17.jar job.setJarByClass(MyWordCount.class); //set mapper.class reducer.class and Job.jar job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setCombinerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); //set output key & value job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); //set input & output paths FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true)?0:1); //whether wait job to done or not } }
2、编译
编译命令如下javac -classpath ./lib/xxx.jar:./lib/xxx.jar -d ../wordcount_classes *.java -encoding gdb-classpath为该java文件需要引用的外部jar包,用“:”符号分隔开;
-d 是指将编译好的 .class 文件存放到 ./wordcount_classes 文件夹内;
*.java 是编译的java文件对象
-encoding gdb 这个可有可无,实际上是没有写的。
3、打jar包
打包命令如下,也就是这个命令的错误直接导致了后面的 ClassNotFoundException 博大精深的java啊..jar -cvf ../MyWordCount.jar -C wordcount_classes/ .
这里注意后面的-C和最后的" ."(有一个空格)
整体编译和打包的情况就如下图所示了:
4、执行
ClassNotFound的图今天看了一天了,所以截下来留着如下:实际的运行结果应该是这个样子的:
5、题外话
尝试过修改 HADOOP_CLASSPATH 虽然没找到估计是被HADOOP-2.2.0给删了吧,但是楞加上也是没有用的;比对了使用 jar -cvf xxx.jar ./classes/* 和 jar -cvf xxx.jar -C ./classes . 生成的 jar 包,看里面包含的内容和大小都是一样一样的,很是奇怪;
本来打算去把 share/hadoop/mapreduce/sources 里面的 hadoop-mapreduce-examples-2.2.0-sources.jar 包里面的文件拿出来的,发现里面竟然都是 .java 文件唉,如下图所示~ 还好小师弟及时跑来了,一个空格一个.解决问题~还有好吃的油桃和李子(xx黑加仑?)谢谢><
相关文章推荐
- java.lang.ClassNotFoundException: 自己编译WordCount编译通过执行报错
- java.lang.ClassNotFoundException: com.hadoop.WordCount$Map
- 解决Eclipse中运行WordCount出现 java.lang.ClassNotFoundException: org.apache.hadoop.examples.WordCount$TokenizerMapper问题【转】
- eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
- 解决Eclipse中运行WordCount出现 java.lang.ClassNotFoundException: org.apache.hadoop.examples.WordCount$Token
- eclipse下执行wordcount报错 java.lang.ClassNotFoundException 解决办法
- HADOOP :: java.lang.ClassNotFoundException: WordCount
- eclipse下执行wordcount报错 java.lang.ClassNotFoundException
- eclipse下执行wordcount报错 java.lang.ClassNotFoundException
- 运行hadoop jar 报错java.lang.RuntimeException: java.lang.ClassNotFoundException: xxxxMapper及mapreduce执行
- Mac系统下执行hadoop jar 运行在某包内的程序 提示java.lang.ClassNotFoundException的解决方法
- java.lang.ClassNotFoundException: Class WordCount$TokenizerMapper not found
- hadoop分布式下打包运行时报java.lang.RuntimeException: java.lang.ClassNotFoundException的原因
- cmd编译执行java文件出现java.lang.ClassNotFound Exception:com.microsoft.sqlserver.jdbc.SQLServerDriver
- java.lang.RuntimeException: java.lang.ClassNotFoundException: cmd.CmdWordCount$MyMapper解决方法
- Eclipse 调试Hadoop java.lang.ClassNotFoundException问题解决
- Ant打包后,运行时却报错:java.lang.ClassNotFoundException: com.***.***.impl.BaseInfo$1
- java.lang.ClassNotFoundException: org.apache.hadoop.hive.hbase.HBaseSplit
- 启动hadoop出现java.lang.ClassNotFoundException: javax.net.SocketFactory
- spark-submit 错误: ava.lang.ClassNotFoundException: WordCount