当前位置:   article > 正文

Hadoop下使用eclipse进行简单词蘋统计超详细。_eclipes词频统计

eclipes词频统计

HadoopWindows下使用eclipse进行简单词蘋统计。

先上一个效果图看看效果

  1. List item

在这里插入图片描述这是数据源
在这里插入图片描述
这个是最后达到效果key,value形式的。

2 准备工作
首先hadoop词蘋统计需要的环境是 eclipse IDE,Maven ,hadoop 2.7.3环境
hadoop2.7.3.tar.gz ( http://hadoop.apache.org官网上也有3.0以上版本,可以自己去下载,主要是旧版本在Apache的仓库里面,下载太慢了,有些有资源还收费也是服了)
https://pan.baidu.com/s/18fWR6PLxykvViA8ci2tetg 提取码: uvyk
Maven3.6.1
https://pan.baidu.com/s/1TKpERP1eWt57ELWtR_x_Rg 提取码: kb17
Windows下配置maven hadoop环境Apache的开源的tar包都是直接解压的
Maven:环境变量
在这里插入图片描述maven解压到一个目录页下建议你的所有环境变量都发到一个地方
然后添加系统环境变量path中加这个
在这里插入图片描述
然后是hadoop 官方下载解压后bin目录下是缺少一个应用程序这个东西Windows下的编译器
在这里插入图片描述
以及需要在
C:\Windows\System32 下加一个在这里插入图片描述
我良心一点把这个资源给你们贴上(ps:我人真好)
https://pan.baidu.com/s/1znKzVqFYDH7vdTutr2yNSQ 提取码 mgfh
下一步hadoop环境变量设置
在这里插入图片描述
HADOOP_HOME 变量然后在向path加
在这里插入图片描述
这一步下Windows下hadoop环境变量就搭建成功了
开始打开eclipse配置一个Maven环境
在这里插入图片描述
Windows下首选项maven User Setting选择
在这里插入图片描述
setting.xml文件
然后打开文件
在这里插入图片描述
加一个这个目录,maven需要下载的jar包的文件路径
然后这个下载的地方阿里云代理
在这里插入图片描述
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central

给你们粘上(Ps:我人真好)
这一步到了环境算是搞完了

3.开始创建Maven应用程序了
你的eclipse应该没有创建过Maven项目就选择other
在这里插入图片描述选择Maven Project
在这里插入图片描述
下一步
在这里插入图片描述
也是直接下一步
在这里插入图片描述
按你的喜好创建所属组,所属包然后finish
然后Maven项目就创建完成了
在这里插入图片描述
下一步点击pom.xml
在这里插入图片描述
然后下载所需要的jar包看图
在这里插入图片描述
我这个配的是3.1.3大家可以改成2.7.3(ps)`在这里插入代
org.apache.hadoop
hadoop-common
3.1.3

	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-client</artifactId>
		<version>3.1.3</version>
	</dependency>

	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-hdfs</artifactId>
		<version>3.1.3</version>
	</dependency>
	附上代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

然后等待下载就可以了
在这里插入图片描述
eclipse右下角查看进度
这一步完成了就可以创建class类了
hadoop词蘋统计需要创建三个类
不想打字了给你们上代码
Mapper类


import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/*
 * KEYIN:偏移量--Long-->LongWritable
 * VALUEIN:一行一行的内容--String-->Text
 * KEYOUT:一个一个的单词--String-->Text
 * VALUEOUT:就是出现1次--Int-->IntWritable
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    Text k=new Text();
    LongWritable v=new LongWritable(1);
	@Override
	protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
	
		System.out.println("key***************:"+key+"********value:"+value);
		if(!"0".equals(key.toString())){
			String line=value.toString();
			String[] words=line.split("\n");
//			k.set(words[]);
			for(String word:words){
				k.set(word);
//				k.set(words[0]);
//				int k1=Integer.parseInt(words[0]) ;
//				k.set(null, Integer.parseInt(words[0].trim()), 0);//  
				context.write(k, v);
				//<hello,1>
			}
		}
		
	}
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

WordCountReducer类


import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

/**
 * @author LYQ
 *
 */
public class WordCountReducer extends Reducer<Text, LongWritable, Text, NullWritable> {
    Map<Word,Long> treeMap=new TreeMap<Word,Long>();
	@Override
    protected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException {
    	System.out.println("***********key:方法的调用输出:"+key);
		//<hello,(1,1,1,1,1)>
    	long sum=0;
    	for(LongWritable value:values){
    		sum=sum+value.get();
    	}
    	
    	Word w=new Word(key.toString(),sum);
        treeMap.put(w, w.getTimes());
    }
	
	@Override
	protected void cleanup(Context context)	throws IOException, InterruptedException {
		for(Word w:treeMap.keySet()){
			context.write(new Text(w.toString()), NullWritable.get());
		}
	}
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

WordCountDriver类

在这里插入代码片
package cqcvc.Test;

import java.io.IOException;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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;


/**
 * 思考的问题:
 * 如何打包后放到Linux集群上去运行?
 * 在特定情况下reducer类可以缺,但是driver和mapper类不能缺
 * mapper和reducer输出的数据类型是可以发生变化的:是可以根据需要去调整
 * 
 * 1、map输入的key到底是什么?我想去看看   偏移量
 * 2、map输入的value到底是什么?   每行的内容
 * 3、mapper类里的map方法到底执行了多少次?    一行内容调用一次map方法
 * 4、reducer类里的reduce方法到底执行了多少次? 每一个唯一的key就调用一次
 * 5、是不是map执行完了再执行reduce,怎么去验证?  map先执行,reduce后执行
 * 6、此程序如何去调用统计HDFS文件系统中的某个文件?把文件路径修改成hdfs://HP01:9000/cqcvc/a.tx
 * 7、我要把h打头的单词放到一个文件中,其他单词放到另外的文件中,我该怎么办? 通过分区Partitioner来实现
 *   如果分区数为3,设置NumReduceTasks为0,可以运行,但是输出的结果是Map输出的结果
 *                                 1,可以运行,但是所有的输出在同一个文件
 *                                 2,分区逻辑错误
 *                                 >=3都是可以正常运行,但是大于3的情况下有空文件产生
 * 8、如何来减轻reducer的合并任务?
 *   一种思路是通过继承Reducer父类而创建一个新的Combiner类,然后在Driver类关联Combiner类
 *   另外一种思路是直接在Driver中setCombinerClass(Reducer类);
 *   在求平均数的场景下不能使用Combiner
 *   
 * 9、如何求平均数,比如求每个单词平均出现的次数 ?
 * 
 * 10、如何对词频统计结果进行排序,出现次数多的排在前面?
 * 11、我要获得出现次数最多的3个单词,怎么获取?
 */
public class WordCountDriver {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		//1、实例化Job
		Configuration conf=new Configuration();
		//System.setProperty("HADOOP_USER_NAME", "root");
		Job job=Job.getInstance(conf);
		
		//2、关联3个Class文件
		job.setJarByClass(WordCountDriver.class);
		job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        
        //分区的设置
//        job.setPartitionerClass(WordCountPartitioner.class);
//        job.setNumReduceTasks(3);
//        
//        //MapTask本地合并的combiner
//        job.setCombinerClass(WordCountReducer.class);
		
		//3、设置Map的输出数据类型<hello,1>--><Text,IntWritable>
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);
		
		//4、设置最终的输出数据类型<hello,5>--><Text,IntWritable>
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(NullWritable.class);
		
		//5、设置输入文件路径
		FileInputFormat.setInputPaths(job, new Path("D:/AuI18N/input/movie.txt"));
		//6、设置输出文件路径
		FileOutputFormat.setOutputPath(job, new Path("D:/AuI18N/output"));
		
		//7、提交job
        boolean b=job.waitForCompletion(true);


        System.out.println("完成");
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

文件路径你们自己改一下就可以了然后就大功告成简单的词蘋统计就完成了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/337576
推荐阅读
  

闽ICP备14008679号