通过上篇文章hadoop之旅5-idea通过maven搭建hdfs环境,相信大家都可以在idea上做hadoop访问hdfs文件系统的开发了。一个云盘其实就可以基于这样的系统做出来。有兴趣的大家可以试着自己去实战一下。
今天带大家在本地执行Mapreduce,进行单词个数的统计,一般用于调试。线上模式也很简单,只需要打好jar包,在线上服务通过 hadoop jar xxxx.jar 包名+类
命令执行即可,可自行探究
MapReduce
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。他也属于hadoop的核心组件之一,hdfs是一个分布式文件系统,MapReduce就是一个分布式计算框架。专门为计算而生
最简单的流程图
- 读取文件
- map操作
- reduce操作
- 输出结果文件
详细过程图
在map,reduce中间还有一系列,合并,排序等等过程,系统会将复杂的数据进行整理筛选,最终到达我们需要用代码编写的业务端。我们一般情况做数据离线分析可以只考虑编写map端,reduce端即可。话不多说直接带大家上代码体会。
开始实现
1.首先
在准备好一个输入文件input.txt
,放在项目任意一个目录下,我建的是SpringBoot项目放在resources
下的map_input
目录下
c 2
c++ 1
java 2
python 1
2.导入依赖
2.7.3
org.apache.hadoop
hadoop-common
${hadoop.version}
org.apache.hadoop
hadoop-client
${hadoop.version}
org.apache.hadoop
hadoop-hdfs
${hadoop.version}
3.准备自己map端
实现map端其实很简单,只需要创建一个类继承Mapper类,然后实现它的map方法即可。
public class MyMapper extends Mapper
4.实现Reduce端
同理,继承Reducer类,实现reduce方法即可
/**
* 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一起)
* 后两个参数:reducer 输出的键,值(即最终结果)
* 在reduce里做累加即可统计出每个单词的个数
*/
public class MyReduce extends Reducer{
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
/**
* key,values
* 以map里的输出的键值:如:map里输出的是:
* c:[1,1]也可能是 c:[2] ,主要涉及MapReducer运行原理中的 分片合并 过程
* c++:[1]
* java:[1,1]也可能是java:[2]
* python:[1]
*/
long sum = 0; //该单词总共出现的次数
for (LongWritable value : values) {
sum+=value.get();
}
context.write(key,new LongWritable(sum)); //输出结果:如,c:2,java:1...
}
}
5. 实现客户端代码
调用代码很常规,基本上都是一样的模板
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
//线上运行在hadoop集群里需要配置
//conf.set("fs.defaultFS", "hdfs://master:9000/");//主master访问路径
//conf.set("mapreduce.framework.name", "yarn"); //运行框架yarn
//conf.set("yarn.resourcemanager.hostname", "master"); //设置主机
Job job = Job.getInstance(conf); //拿到一个作业job,来执行mapReduce
//设置运行的主类
job.setJarByClass(MapReduceClient.class);
job.setJobName("wordCount"); //设置应用名称
//设置输入文件的位置
FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");
//设置输出文件的位置
FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));
//设置mapper类和reducer类
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReduce.class);
//设置输入,输出类型,map和reduce是一样的话可以只写reducer的
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//执行
job.waitForCompletion(true);
}
在本地运行有个要求,需要本地hadoop的bin目录下拥有windows下的执行文件。大家可以下好hadoop之后直接解压,然后把windows执行包复制到bin目录即可
最终的运行结果如下