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
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop单词计数功能可以通过MapReduce编程模型来实现。具体步骤如下: 1. Mapper阶段:将输入文件划分成若干个小块,每个小块由一个Mapper进行处理。Mapper首先将输入的文本进行切分,将每个单词作为一个key,将其出现的次数作为value进行输出。 2. Shuffle阶段:将Mapper阶段输出的键值对按照key进行分组,将相同key的value合并在一起,得到一个key-value列表。 3. Reducer阶段:将Shuffle阶段输出的key-value列表按照key进行分组,然后对每个key的value进行汇总,得到最终的统计结果。 下面是一个简单的Hadoop单词计数的MapReduce程序实现: Mapper代码: ``` public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } ``` Reducer代码: ``` public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } ``` 在main函数中进行Job的配置和提交: ``` Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); ``` 以上代码实现了一个简单的Hadoop单词计数程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值