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端口查看
这里也可以下载这个文件查看计数情况