package com.yc.hadoop.hdfs;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 单词统计
* @company 源辰信息
* @author navy
* 导包:
*
hadoop-3.0.0\share\hadoop\mapreduce下的jar包
*
hadoop-3.0.0\share\hadoop\common下的jar包
* hadoop-3.0.0\share\hadoop\yarn下的jar包
*/
public class YcWordCount {
/**
* 第一、二个参数表示输入map的key和value,从InputFormat传过来的,key默认是字符偏移量,value默认是一行
* 第三、四个表示输出的key和value
* @company 源辰信息
* @author navy
*/
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
/*
* IntWritable是 Hadoop 中实现的用于封装 Java 数据类型的类,它的原型是public IntWritable(int value)和public IntWritable()两种。
* 所以new IntWritable(1)是创建了这个类的一个对象,而数值1这是参数。在Hadoop中它相当于java中Integer整型变量,为这个变量赋值为1.
*/
private final static IntWritable one = new IntWritable(1);
/*
* 这类存储的文本使用标准UTF8编码。它提供了序列化、反序列化和比较文本的方法。
* Text类使用整型来存储字符串编码中所需的字节数。即Text存储的是字节数,这个字节数用整型存储,并且使用零压缩格式进行序列化。
* 此外,它还提供了字符串遍历的方法,而无需将字节数组转换为字符串。
*/
private Text word = new Text(); // 输出的键 单词
/*
* context它是mapper的一个内部类,简单的说顶级接口是为了在map或是reduce任务中跟踪task的状态,很自然的MapContext就是记录了map执行的上下文,
* 在mapper类中,这个context可以存储一些job、conf的信息,比如job运行时参数等,我们可以在map函数中处理这个信息,这也是hadoop中参数传递中一个很经典的例子,
* 同时context作为了map和reduce执行中各个函数的一个桥梁,这个设计和java web中的session对象、application对象很相似(non-Javadoc)
*/
// 处理经过 TextInputFormat 产生的 <k1,v1>,然后产生 <k2,v2>
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
//它是一个很方便的字符串分解器,主要用来根据分隔符把字符串分割成标记(Token),然后按照请求返回各个标记。
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken()); // 读取到的单词作为键值
context.write(word,one); // 以单词,1的中间形式交给reduce处理
}
}
}
public static class IntSumReducer 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);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(YcWordCount.class);
job.setCombinerClass(IntSumReducer.class);
// 设置MapReduce类
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);
// 设置输出格式
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
/*
* 报错 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
* 请查看报错文档
*/
FileInputFormat.addInputPath(job, new Path("hdfs://192.168.30.130:9000/user/navy/yc.txt"));
// 查看hdfs上的文件和目录 hadoop fs ls /
// 删除目录 hadoop fs -rm -r /<目录名>
// 查看统计信息 hadoop fs -cat wordcount/part-r-00000
FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.30.130:9000/user/navy/wordcount"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
|
Hadoop WordCount
最新推荐文章于 2022-09-19 10:22:09 发布