赞
踩
先上一个效果图看看效果
这是数据源
这个是最后达到效果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>
附上代码
然后等待下载就可以了
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> } } } }
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()); } } }
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("完成"); } }
文件路径你们自己改一下就可以了然后就大功告成简单的词蘋统计就完成了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。