Hadoop实现wordcount单词计数(eclipse架包操作)

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端口查看

这里也可以下载这个文件查看计数情况

 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值