欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【MapReduce篇01】MapReduce之入门概述

时间:2023-07-25

先知道是什么,再去了解为什么

MapReduce入门概述 MapReduce定义

MapReduce是一个基于Hadoop的分布式运算程序的编程框架

​ 它的核心功能是将用户编写的业务逻辑代码和自带的组件组合成为一个完整的分布式运算程序,并发的运行在Hadoop集群上。

MapReduce优点

MapReduce易于编程:简单的实现一些接口就可以实现分布式程序,并且这个分布式程序可以分布到大量廉价的PC机器上执行。良好的扩展性:加机器就可以增加计算能力高容错性:所谓容错就是当系统中一台机器故障时候,有一种机制可以将任务分配到新机器上然后继续运行,这个过程是不需要人工干涉的适合PB级上数据的离线处理:大数据的稳定处理 MapReduce缺点

不擅长实时计算:MapReduce不能像Mysql,在毫秒级或秒级返回结果不擅长流式计算:流式计算输入数据是动态的,连续不断的,但是MR处理的数据一定是静态的,这是由设计决定的不擅长DAG计算:多个任务具有依赖关系,后者输入依赖前者输出,这种活MR不擅长,读写磁盘太多性能下降 MapReduce统计单词过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cS8UUA5n-1644239499143)(C:UsersZYTAppDataRoamingTyporatypora-user-imagesimage-20200514143812863.png)]

默认是按照128M进行数据切块哦

在上图进程一共有三种:

APPMaster:负责整个程序的过程调度和状态协调

MapTask:负责Map阶段的整个数据处理流程

ReduceTask:负责Reduce阶段的整个数据处理流程

MapReduce编程套路

我们编写的部分基本分为三个:Mapper,Reducer和Driver

Map阶段

(1)用户自定义Mapper要继承的父类

(2)Mapper的输入数据格式是KV对

(3)Mapper中业务逻辑写在map()方法中【map()对每个KV对调用一次】

(4)Mapper的输出数据格式也是KV对

Reducer阶段

(1)用户自定义Reducer继承自己的父类

(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV

(3)Reduce业务逻辑写在reduce()方法中【reduce()对每个KV对调用一次】

Driver阶段

相当于YARN集群的客户端,等等程序写完,需要通过它把整个程序提交到YARN集群上

HELLO WORLD案例 需求

统计文件中单词的出现的词频

Mapper代码

public class WordcountMapper extends Mapper{Text k = new Text();IntWritable v = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {// 1 获取一行String line = value.toString();// 2 切割String[] words = line.split(" ");// 3 输出for (String word : words) {k.set(word);context.write(k, v);}}}

Reducer阶段

public class WordcountReducer extends Reducer{int sum;IntWritable v = new IntWritable();@Overrideprotected void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {// 1 累加求和sum = 0;for (IntWritable count : values) {sum += count.get();}// 2 输出 v.set(sum);context.write(key,v);}}

Driver驱动类

public class WordcountDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 输入输出路径需要根据自己电脑上实际的输入输出路径设置// 注意这里是在win下跑,如果放到集群上路径需要更改args = new String[] { "e:/input/inputword", "e:/output1" };// 1 获取配置信息以及封装任务Configuration configuration = new Configuration();Job job = Job.getInstance(configuration);// 2 设置jar加载路径job.setJarByClass(WordcountDriver.class);// 3 设置map和reduce类job.setMapperClass(WordcountMapper.class);job.setReducerClass(WordcountReducer.class);// 4 设置map输出job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5 设置Reduce输出job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 6 设置输入和输出路径FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));// 7 提交boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。