【Hadoop】Hadoop-wordcount单词统计
·
pom.xml
<properties>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
Mapper.java
package mapreduce;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import java.io.IOException;
/**
* 这部分的输入是由mapreduce自动读取进来的
* 简单的统计单词出现次数<br>
* KEYIN 默认情况下,是mapreduce所读取到的一行文本的起始偏移量,Long类型,在hadoop中有其自己的序列化类LongWriteable
* VALUEIN 默认情况下,是mapreduce所读取到的一行文本的内容,hadoop中的序列化类型为Text
* KEYOUT 是用户自定义逻辑处理完成后输出的KEY,在此处是单词,String
* VALUEOUT 是用户自定义逻辑输出的value,这里是单词出现的次数,Long
*
*/
public class Mapper extends org.apache.hadoop.mapreduce.Mapper<LongWritable,Text,Text,IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//读取一行
String line = value.toString();
//通过空格分隔
String[] words = line.split( " ");
//循环遍历输出
for(String word : words){
context.write(new Text(word),new IntWritable(1));
}
}
}
Reduce.java
package mapreduce;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* 第一个Text: 是传入的单词名称,是Mapper中传入的
* 第二个:LongWritable 是该单词出现了多少次,这个是mapreduce计算出来的,比如 hello出现了11次
* 第三个Text: 是输出单词的名称 ,这里是要输出到文本中的内容
* 第四个LongWritable: 是输出时显示出现了多少次,这里也是要输出到文本中的内容
*
*/
public class Reduce extends Reducer<Text,IntWritable,Text,IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
for(IntWritable value : values){
count += value.get();
}
System.out.println(key+":"+count);
context.write(key,new IntWritable(count));
}
}
HelloWorld.java
package mapreduce;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.LocalJobRunner;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 相当于运行在yarn中的客户端
*
*/
public class HelloWorld {
public static void main(String[] args){
try {
Configuration conf = new Configuration();
//设置job对象
Job job = Job.getInstance(conf,"count");
//设置运行job类
job.setJarByClass(HelloWorld.class);
//设置mapper类
job.setMapperClass(Mapper.class);
//设置reduce
job.setReducerClass(Reduce.class);
//设置mapper输出key value
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置输入输出路径
FileInputFormat.setInputPaths(job,new Path("C:\\Users\\Administrator\\Desktop\\word.txt"));
FileOutputFormat.setOutputPath(job,new Path("C:\\Users\\Administrator\\Desktop\\outword.txt"));
//提交job
boolean b = job.waitForCompletion(true);
if(!b){
System.out.println("wordcount task fail!");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果
good:2
haha:1
many:2
what:2
更多推荐



所有评论(0)