Hadoop3教程(七):MapReduce概述

文章目录

  • (68) MR的概述&优缺点
  • (69)MR的核心思想
    • MapReduce进程
  • (70)官方WC源码&序列化类型
  • (71)MR的编程规范
    • Mapper
    • Reducer
    • Driver
  • (72)WordCount案例需求分析
  • 参考文献

(68) MR的概述&优缺点

MapReduce是一个分布式运算程序的编程框架,简单的说,就是一个 分布式计算框架,是Hadoop的核心所在。

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

优点:

  • 易于编程。用户只关心业务逻辑就可以;
  • 良好的扩展性。可动态增加服务器节点,以解决计算资源不足的问题;
  • 高容错性。如果有一台节点崩溃,不会影响整个集群的计算。其他可用节点会接过崩溃节点的任务,继续计算。
  • 适合海量数据的计算。这里的海量,一般是指TB以上级别的。

缺点:

  • 不擅长实时计算。无法达到mysql这种毫秒级查询,无法快速响应;
  • 不擅长流式计算。指数据一条条过来,实时的流式计算。一般是spark streaming和flink适合做这个。MR的特性决定了其数据源必须是静态的。
  • 不擅长DAG有向无环图。像是迭代计算,即DAG中,任务一的输出会作为任务二的输入,任务二的输出则会作为任务三的输入,以此类推,是一个链式的结构。MR不擅长处理这种,当然,只是不擅长,不是不支持。相比来讲,spark更适合用来处理这种任务。( 因为spark的中间结果是基于内存的,而MR是基于磁盘,重复IO性能太低下

(69)MR的核心思想

经典案例:统计一段话中每个单词出现的总次数,其中a~p的结果放在一个文件,q~z的结果放在一个文件里。

MR的计算分为两个阶段:Map阶段和Reduce阶段。

接下来我们以经典案例,来讲解MR的主要工作流程,如图:

在这里插入图片描述

1) Map阶段,是任务分配阶段,一般是按照块大小,每个MapTask负责处理一块数据。这个块一般是128M。

这个阶段的MapTask并发实例,完全并发运行,互不相干。

在我们刚说的这个案例里,MapTask中都做了些什么呢?

  • 一行一行读数据,进行处理;
  • 按照空格分割行内单词;
  • 把切出来的单词,组成KV键值对(单词,1)
  • 将所有的KV键值对,按照单词首字母,分成两个分区(ap分区和qz分区),导出至磁盘保存。

2) Reduce阶段,就是任务汇总统计阶段。

这一阶段的ReduceTask并发实例也是互不相干,但是它们依赖于Map阶段所有MapTask并发实例的输出。

在这个案例里,因为结果需要有2个文件,所以这里会有2个ReduceTask,一个负责汇总出ap,一个负责汇总出qz,并分别输出至文件。

在一个MR计算过程中,只能包含一个Map阶段和一个Reduce阶段。如果用户的业务逻辑过于复杂,那么可以创建多个MR计算程序,串行计算。这就相当于链式的有向无环图计算了。

一些问题细节:

  • MapTask内部是如何工作的?
  • ReduceTask内部是如何工作的?
  • MapTask内部是如何排序、控制分区的?
  • MapTask和ReduceTask之间是如何衔接的?

这些问题都将在后面一一解答。

MapReduce进程

一个完整的MR程序在分布式运行的时候,会产生三种类型的进程:

  • MrAppMaster:是ApplicationMaster的子进程,负责整个Mr程序的过程调度及状态协调;
  • MapTask:负责Map阶段的数据处理流程;
  • ReduceTask:负责Reduce阶段的数据处理流程

MapTask和ReduceTask似乎都是yarnchild,这里仅供参考一下。

(70)官方WC源码&序列化类型

WordCount(即WC),这是Hadoop里一个很经典的MR案例,教程后面很多地方在讲解底层原理的时候都会以WC为例做讲解。

官方WordCount的源码在哪儿呢?

大概在Hadoop安装目录的share/hadoop/mapreduce/hadoop-mapreduce-example-xxx.jar,这里面存储了Hadoop的一些代码案例。

jar包反编译工具:jd-gui。

WC的源码里,核心是三个类:

  • 主类,负责调度/驱动
  • TokenizerMapper类,继承了Mapper
  • IntSumReducer类,继承了Reducer

分工很明确。

另外,这里简单介绍下hadoop中常用的数据序列化类型,后面讲序列化的时候会用到:

Java类型Hadoop Writable类型
BooleanBooleanWritable
ByteByteWritable
IntIntWritable
FloatFloatWritable
LongLongWritable
DoubleDoubleWritable
StringText
MapMapWritable
ArrayArrayWritable
NullNullWritable

(71)MR的编程规范

用户在编写一个完整的MR程序时,需要实现3个部分,即Mapper、Reducer和Driver。

Mapper

Mapper阶段:

  • 用户自定义的Mapper,要继承对应的系统Mapper类;
  • Mapper的输入数据需要是KV键值对的形式;
  • Mapper中的业务逻辑,需要写在Mapper类里声明的map()方法里;
  • Mapper的输出数据,也需要是KV对的形式;
  • map()方法对每一个KV对,都调用一次;(每个KV都会跑一遍属于自己的map()方法)

Reducer

Reducer阶段:

  • 用户自定义的Reducer,要继承对应的系统Reducer类;
  • Reducer的输入类型跟Mapper的输出类型是要保持一致的。这个很好理解,串行的毕竟;
  • Reducer的业务逻辑,需要写在Reducer类里声明的reduce()方法里;
  • 在ReduceTask进程中,reduce()对==每一组相同K==的KV对,都调用一次;(所以这里容易发生数据倾斜)

注意,最后一条,Mapper跟Reducer是不一样的。Reducer是每一组相同K的KV对,进一个reduce()。

这个其实很好理解,Reducer阶段就是做汇总的,它是一个数据量减少的过程,其实就是一个把n条具有相同特征的数据,合并成一条数据的过程。

以WC举例,第一句话里字母a出现了3次,第二句话里字母a出现了4次,即mapper会分别输出两个键值对,即(a,3)和(a,4),Reducer则会将这两个键值对输入同一个reduce()进行加和,并最终输出(a,7)。

Driver

Driver阶段:

相当于yarn集群的客户端,用于提交整个程序到YARN集群,具体提交的是什么呢?其实是封装了MR程序相关运行参数的一个job对象。所以驱动类里其实就是定义一些运行参数之类的。

(72)WordCount案例需求分析

一个标准的WordCount需求:统计给定的文本文件中,每一个单词出现的次数。

我们需要针对这个需求,编写对应的Mapper、Reducer和Driver。

这里就不展示代码了,只是展示一下各个类的主要功能。

Mapper负责:

  • 将MapTask传过来的文本内容先转换成string;
  • 根据空格将这一行切分成单词;
  • 将切出来的单词,包装成键值对<单词,1>的形式;

Reducer负责:

  • 将相同K的value值加在一起;
  • 输出该K的总次数;

Driver阶段:

  • 获取配置信息,获取job对象实例;
  • 指定本程序的jar包所在的本地路径;
  • 关联Mapper和Reducer业务类;
  • 指定Mapper的输出类型(K和V是什么类型);
  • 指定最终输出的类型。(整个MR程序结束后的输出,而不是Reducer阶段的输出)
  • 指定job的输入文件的所在目录;
  • 指定job的输出结果的所在目录(输出目录不能提前存在?);
  • 提交作业;

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV16-图像连通域分析

OpenCV16-图像连通域分析 1.图像连通域分析2.connectedComponents3.connectedComponentsWithStatus 1.图像连通域分析 连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域。连通域分析是指在图像中寻找彼此互相独立的连通域并将其标记出来。 4邻域与8邻域的概念&am…

梯度下降算法(Gradient Descent)

GD 梯度下降法的含义是通过当前点的梯度&#xff08;偏导数&#xff09;的反方向寻找到新的迭代点&#xff0c;并从当前点移动到新的迭代点继续寻找新的迭代点&#xff0c;直到找到最优解&#xff0c;梯度下降的目的&#xff0c;就是为了最小化损失函数。 1、给定待优化连续可微…

PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术

近期&#xff0c;2023年中国模式识别与计算机视觉大会&#xff08;PRCV&#xff09;在厦门成功举行。大会由中国计算机学会&#xff08;CCF&#xff09;、中国自动化学会&#xff08;CAA&#xff09;、中国图象图形学学会&#xff08;CSIG&#xff09;和中国人工智能学会&#…

分享一个比对图片是否一致的小工具(来源: github)

运行效果图: 官网: GitHub - codingfishman/image-diff: 一个方便的图片对比工具一个方便的图片对比工具. Contribute to codingfishman/image-diff development by creating an account on GitHub.https://github.com/codingfishman/image-diff 优缺点: 1.采用比对各色块是…

从一道面试题开始学习C++标准库提供的并发编程工具

一个空列表&#xff0c;用两个函数&#xff08;只可调用一次&#xff09;轮流写入值&#xff08;一个写奇数&#xff0c;一个写偶数&#xff09;&#xff0c; 最终实现列表的值为1-100&#xff0c;有序排列。 简单分析&#xff1a;假设这两个函数分别为A和B&#xff0c;A函数往…

Sqoop技术文档笔记

Sqoop是一个用于在Hadoop和关系型数据库之间传输数据的开源工具。它可以将结构化数据从关系型数据库&#xff08;如MySQL、Oracle、SQL Server等&#xff09;导入到Hadoop的分布式文件系统&#xff08;HDFS&#xff09;或hive中&#xff0c;并且可以将数据从HDFS、hive导出到关…

安装VSCode,提升工作效率!iPad Pro生产力进阶之路

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

mac 启动mysql Error: Failure while executing; `/bin/launchctl bootstrap gui/501

Error: Failure while executing; /bin/launchctl bootstrap gui/501 /Users/<myUserName>/Library/LaunchAgents/homebrew.mxcl.mysql8.0.plist exited with 5.homebrew 给的提示看不到具体消息 查看 homebrew.mxcl.mysql8.0.plist文件&#xff0c;能看到具体的启动命令…

Netty使用SslHandler实现加密通信-双向认证篇

“不积跬步&#xff0c;无以至千里。” 说明 其实Netty使用SslHandler实现加密通信单向认证和双向认证在代码上区别不大&#xff0c;下面是双向认证的代码示例 引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifac…

webrtc基于DTLS的端口复用技术

DTLS协议: DTLS(Datagram Transport Layer Security)数据包安全传输协议,用于在不可靠的数据包传输协议上(如UDP)提供数据的安全传输。 UDP多路复用: 一个UDP多路复用&#xff0c;被用来处理共享同一个UDP端口的多个并发的UDT连接。类似同一个tcp port上创建多个socket connec…

【复盘】主从延迟以及 Waiting for tablemetadata lock 线上问题

背景 今晚DBA给一个大表添加索引&#xff0c;1000多W&#xff0c;正好风控系统这个时间段有查询这个表的请求&#xff0c;于是就出现了复制延迟。 这是正常下的延迟 可以看出基本都是是100毫秒以下。 Waiting for tablemetadata lock&#xff0c;并且业务跑的SQL出现锁等待…

append_ocr_trainf

read_image (Image, D:/图像文件/字符识别/1-1.bmp) access_channel (Image, Image1, 1) * draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2) gen_rectangle2 (Rectangle, 96.0436, 715.9526, 0.0173917050943654, 110.186941, 18.041084) reduce_domain (Image1, …

多线程处理文件集合,先拆分,在执行

try {File file new File(path);File[] files file.listFiles();log.info("当前共有文件 "files.length"个");List<File> filesList new ArrayList<>(Arrays.asList(files));List<List<File>> dividedLists SplitListUtils.sp…

[笔记] 十进制转n进制

思路 n对 xa取模&#xff0c;就是xa-1 位上的数字&#xff0c;因为模出来的数不足xa 举例来说就是5&211&#xff0c;这个1就是20位上的1 当前位取完后&#xff0c;n/xa&#xff0c;表示n将对x(a1)进行取模&#xff08;进入下一位&#xff09; 重复此操作直至n0。 代码实现 …

开发者职场“生存状态”大调研报告分析 - 第四版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

.mxdown-V-XXXXXXXX勒索病毒感染后的下一步:恢复您的文件

引言&#xff1a; 在数字时代&#xff0c;计算机用户日益面临着来自网络犯罪分子的各种威胁&#xff0c;其中包括勒索病毒&#xff0c;如.mxdown-V-XXXXXXXX。这种勒索病毒可以对你的个人和商业数据文件进行加密&#xff0c;并要求支付赎金才能解锁它们。本文91数据恢复将介绍…

矩阵键盘中断扫描

/*----------------------------------------------- 内容&#xff1a;如计算器输入数据形式相同 从右至左 使用行列扫描方法 中断方式可以有效提供cpu工作效率&#xff0c;在有按键动作时才扫描&#xff0c;平时不进行扫描工作 -------------------------------------…

centos 7.9每天定期发送最新备份文件到另外一台服务器

1.需求 在本地化部署的过程中&#xff0c;为了使系统相对来说高可用&#xff0c;一般情况下&#xff0c;我们都会做一个负载&#xff0c;但是客户又会考虑成本&#xff0c;所以只有可怜巴巴的两台服务器&#xff0c;要全部服务都做负载&#xff0c;这个就实现不了。所以只能把…

1.13.C++项目:仿muduo库实现并发服务器之TcpServer模块的设计

文章目录 一、LoopThreadPool模块二、实现思想&#xff08;一&#xff09;管理&#xff08;二&#xff09;流程&#xff08;三&#xff09;功能设计 三、代码 一、LoopThreadPool模块 TcpServer模块&#xff1a; 对所有模块的整合&#xff0c;通过 tcpserver 模块实例化的对象&…

Python中的元组

Python 元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。以下是关于Python元组的一些基本信息&#xff1a; 元组的使用&#xff1a;元组是一个不可变的序列类型&#xff0c;使用小括号 () 来定义。元组没有增加元素append、修改元素、删除元素pop的…