利用mapreduce做单词计数
## 1. 开集群
Master保证NameNode,SecondNameNode,ResourceManager启动
Slave保证DateNode,NodeManager启动
## 2. eclipse压缩包传到softerware,解压,安装
进入eclipse目录,打开eclipse
nohup ./eclipse &
## 3. 创建工程
新建java工程,名字hadoop
在工程名hadoop上单击鼠标右键
点击Build Path
点击Configure Build Path
弹出窗口,在libraries中选择Add External Jars
开始导入jar包
1)Hadoop-softerware-hadoop2.7.3-share-common中的jar包+common-lib中的jar包导入
2)Hadoop-softerware-hadoop2.7.3-share-hafs中的jar包+hdfs-lib中的jar包导入
3)Hadoop-softerware-hadoop2.7.3-share-mapreduce中的jar包+mapreduce-lib中的jar包导入
4)Hadoop-softerware-hadoop2.7.3-share-yarn中的jar包+yarn-lib中的jar包导入
## 5. 创建Wordcount的Mapper类
在工程src源码包上新建package,名字为wordcount
1) 在此wordcount中建立一个class名字WordMap,
在代码WordMap后加extends Mapper, 继承Mapper类,导包:Mapper-org.apache.hadoop.mapreduce
2) Mapper类的输入键值对中键是LongWritable(输入单词,可序列化)类型,值是Text类型,Text导包:Text-org.apache.hadoop.io
3) 输出键值对中键是Text类型,值是IntWritable(统计每个单词次数)类型
IntWritable导包:IntWritable-org.apache.hadoop.io
## 6. 覆写Mapper类中的map逻辑
右键-source-Overmde-勾选map-删除后两行
读取数据的每一行,将value转换成string类型,再按照字段之间的分隔符进行切分,得到一个字符串数组
String[] words = value.toString().split(“ ”);//Map切分,reduce计数,将切分的单词输出出去,用for循环//
for(String word: words){
wordkey.set(word);//赋值//
context.wirte(wordkey,countValue);
}
//set导包:set(byte[],utf8,int start,int lea):void,
countValue导包:countValue-InWritable.WordMap //
## 7. 创建Wordcount的Reduce类
1)在名为wordcount的package中创建一个class名字是WordReduce,
在代码WordMap后加extends Reducer, 继承Reducer类
导包:Reducer-org.apache.hadoop.mapreduce
2) Reducer类的输入键值对中键是Text类型,值是IntWritable类型(与Mapper输出的键值对类型分别一致)
3) 输出键值对中键是Text类型,值是IntWritable类型
7.1覆写Reducer类中的reduce方法
右键-source-Overmde-勾选reduce-删除后两行
修改参数arg0-word,arg1-values,arg2-context
value进行切分,用for循环对value进行计数
int sum = 0;
for(IntWritable value:values){
sum += value.get();}//get导包get:int-IntWritable//
context.write(word,new IntWritable(sum));//write导包:第一个//
## 8. 创建Wordcount中包含main方法的类
在名为wordcount的package中创建一个class,名字是WordMain,勾选public static void main
1)输入两个参数,一个表示输入文件,一个表示输出结果
If(args.length != 2 || args == null)
{
Systemout.out.println(“need two arguments: input path, output path”);//导包:
syso第一个包
System.exit(0);//exit导包:System.exit:void-java.lang.System;
}
2)生成job对象
Configuration conf = new Configuration();//导包:Configuration()-org.apache.hadoop.conf.Configuration
Job job = Job.getInstance(conf);//导包: getInstance(Configuration conf)-org.apache.hadoop.conf.Configuration
把job对象抛掉
job.setJobNnames(WordMain.class.getSinpleName())//导包setJobNames(String Name):void – Job
3)设置job入口
job.setJarBycalss(WordMain.class)
4)设置输入输出格式
job.setInputFormatClass(TextInputFormat.class)// 导包:TextInputFormat-org.apache.hadoop.mapreduce lib,,,,,,,,
job.setOutputFormatClass(TextOutputFormat.class)
5)设置输入输出路径
FileInputFormat.setInputPaths(job,new Path(args[0]));//导包setInputPaths(Job.arg0.Path,,,,,,)void,Path导第一个包,泛型删掉
FileOutputFormat.setOutputPaths(job,new Path(args[1]));
6)将设置的map,reduce逻辑提交进来
job.setMapperClass(wordMap.class)
job.setReducerClass(wordReduce.class)
7)设置输出的键的类型,值的类型
Job.setOutputKeyClass(Text.calss)
Job.setOutputValueClass(Intwritable.calss)
8)等待程序执行
job.waitForCompletion(true);将job抛出去
进入hadoop根目录
Hadoop fs -ls /
找到文件README.txt,此文件用来单词计数,
部分hadoop的README.txt在softerware里,将这个文件传到hadoop根目录下
在main类class的代码开头,选中void main,右键-run as-RunConfiguration-java application新建WordMain-Argument在上面的空白框中写路径,hdfs://master:9000/README.txt hdfs://master:9000/wordcount-out
## 9.进入hadoop的wordcount-out目录中
hadoop fs – ls /wordcount-out
打开相应的结果存储文档
hadoop fs – cat /wordcount-out/part-r-00000
就能看到结果
10.打包
回到eclipse,在工程名Hadoop点击右键-export-java-jar file-next- home-hadoop-名称写word count
11.在Main类的class的代码开头选定 WordMain右键copy name ,
到Hadoop里
1)pwd
2)hadoop jar wordcount.jar+刚刚copy的name+ hdfs://master:9000/README.txt hdfs://master:9000/wordcount-out02
3)hadoop fs – cat /wordcount-out02/part-r-00000
完成