赞
踩
Hadoop系统环境:CentOS4
例子:计数文件名为hello
实现流程:
1.eclipse写三个操作类
(1)主函数所在类WCDemo
- package cn.cqsw;
-
- import java.io.IOException;
-
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.LongWritable;
- 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.output.FileOutputFormat;
-
-
- public class WCDemo {
- public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
- Configuration conf = new Configuration();
- Job job = Job.getInstance(conf);
- job.setJarByClass(WCDemo.class);
- // 指定mapper类和reducer类
- job.setMapperClass(WCMap.class);
- job.setReducerClass(WCReduce.class);
- // 指定maptask的输出类型
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(LongWritable.class);
- // 指定reducetask的输出类型
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(LongWritable.class);
- // 指定该mapreduce程序数据的输入和输出路径
- Path inputPath = new Path("/hello");
- Path outputPath = new Path("/out3");
- FileInputFormat.setInputPaths(job, inputPath);
- FileOutputFormat.setOutputPath(job, outputPath);
- boolean waitForCompletion = job.waitForCompletion(true);
- System.exit(waitForCompletion?0:1);
- }
-
-
- }
这里有两个需要注意的点:
1、代码中:// 指定该mapreduce程序数据的输入和输出路径
Path inputPath = new Path("/hello");
Path outputPath = new Path("/out3");
/hello指的是需要计数单词的文件的路径 /out3指的是输出计数情况的文件的路径
这里的路径是因为博主将这个架包和hello文件放在同一目录下!!(看后面的截图)
而且,最好提前设定好需要计数的文件,以免找不到文件!
2、博主包名为cn.cqsw,之后的代码里面需要用到自己的包名!!
(2)类WCMap
- package cn.cqsw;
-
- import java.io.IOException;
-
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Mapper;
-
- /**
- *
- * KEYIN 即k1 表示行的偏移量
- * VALUEIN 即v1 表示行文本内容
- * KEYOUT 即k2 表示行中出现的单词
- * VALUEOUT 即v2 表示行中出现的单词的次数,固定值1
- *
- */
- public class WCMap extends Mapper<LongWritable, Text, Text, LongWritable> {
-
- @Override
- protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text,LongWritable>.Context context)
- throws IOException, InterruptedException {
- //按空格来分割
- String[] splited=value.toString().split(" ");
- for(String str :splited)
- {
- //按KV的形式输出数据
- context.write(new Text(str),new LongWritable(1));
- }
- }
- }
(3)类WCReduce
- package cn.cqsw;
-
- import java.io.IOException;
-
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
-
- /**
- *
- * KEYIN 即k2 表示行中出现的单词
- * VALUEIN 即v2 表示出现的单词的次数
- * KEYOUT 即k3 表示行中出现的不同单词
- * VALUEOUT 即v3 表示行中出现不同单词的总次数
- *
- */
- public class WCReduce extends Reducer<Text, LongWritable,Text, LongWritable> {
- @Override
- protected void reduce(Text text, Iterable<LongWritable> iterable,Reducer<Text, LongWritable,Text,LongWritable>.Context context) throws IOException,InterruptedException {
- long time=0;
- for(LongWritable lw :iterable)
- {
- time+=lw.get();
- }
- context.write(text, new LongWritable(time));
- }
- }
-
2. 打成架包并传到Hadoop所在系统上去(博主的架包名为11_28.jar)
3.复制需要计数的文件到HDFS系统上
这两步骤在博主之前的文章中有详细的步骤,在这就不重复说明了,不懂的小伙伴可以看一下下面这篇文章~
复制本地文件到HDFS系统(eclipse操作 )_资深咸鱼~的博客-CSDN博客
4. 单词计数实现
(1)这里说明一下博主的架包11_28.jar和计数文件hello,在同一目录/opt下
(2) 在Xshell的会话中输入命令
hadoop jar 11_28.jar cn.cqsw.WCDemo
再次提醒: 红色的为架包名,蓝色的为包名,紫色的为主函数所在的类名!!
(3)查看计数情况
hadoop fs -cat /out3/part-r-00000
注意:/out3指的是输出计数情况的文件的路径, 最好设置为以前没有设定为输出计数情况的文件名,避免报错!!!报错问题和情况和解决方法博主之前也写过的!!
如果不记得了,看下面这个文章!!这个文章也提到了Hadoop另一种计数方法,有兴趣的小伙伴也可以学习!!
Hadoop实现单词计数_资深咸鱼~的博客-CSDN博客_用hadoop进行单词计数
(5)在50070端口查看
这里也可以下载这个文件查看计数情况
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。