前言

在之前的系列内, 多数都是介绍Hadoop MR的基本操作, 对于运行原理涉及较少. 本章, 主要补充下这部分的内容. 方便以后的理解.

本章主要分为如下几个部分:

  • WordCount的分布式运算设计
  • WordCount的执行过程
  • Job的提交流程
  • MR运行总过程
  • Yarn的提交流程

正文

WordCount运行设计

WordCountMap/Reduce主要分为如下几个阶段:

  • Mapper主要负责任务的初级处理, Reducer主要负责数据的合并;
  • Mapper端的操作为(读取数据/按行处理/每行按空格切分单词/数据存入HashMap/将HashMap按照范围切分/HashMap 数据传递给下游, 即Reducer端)
  • Reducer端的操作为(累加操作/输出操作)
  • NodeManager处理如下操作: MapTask分配 / ReduceTask分配 / MapTaskReduceTask的串链(包括数据的切分) / MapTask& ReduceTask失败机制
Job提交过程(WordCount为例子)


Job的提交流程如上所示:

  • Client端首先根据数据, 对文件进行切分(切分后即知道需要几个MapTask进行处理), 切分后提交给Yarn, 即ResourceManager. 提交给Yarn时, 主要包括job.split/a.jar/job.xml三个文件.
  • Yarn首先会启动一个MR Process运行这个程序, 即运行Jar包.
  • MR Process通过job.split等得知需要启动几个MapTask, 启动MapTask执行Map的操作.
  • MapTask通过InputFormat去既定的资源中读取数据, 分别执行map()操作, 随后将自己处理后的数据放入context.(context.write(xx,xx);). 随后通过OutputCollectReduceTask的相关信息, 将处理过的数据传递给ReduceTask.
  • ReduceTask得到数据后, 通过map()进行遍历处理. 处理结束后, 通过OutputFormat将数据存放在约定位置.

注意: 值得一提的是ReduceTaskMapTask在运行map()方法前都会通过setup()方法进行初始化操作. 运行map()方法后, 会通过cleanup()方法进行处理操作. 其中map()方法可能执行多次, 而初始化和结束方法都只执行一次.

InputFormat与数据切片


主要流程为:

  • 读取文件所在目录,获取原文件大小.
  • 通过split()方法对其进行切片;
  • 将切片的规划放入文件内job.xml等文件.

切片相关参数: Math.max(minSize,Math.min(maxSize,blockSize)).

  • minSize: 默认为1, 配置参数mapreduce.input.fileinputformat.split.minsize.
  • maxSize: 默认值为Long.MAXVALUE, 配置参数mapreduce.input.fileinputformat.split.maxsize.
  • blockSize
    默认情况下,切片大小为BlockSize. maxsize, 如果设置比blockSize小会使得切片变小. minsize, 如果设置比BlockSize大, 则可以让切片变得比BlockSize大.
实例:
比如有两个文件: file1.txt 320M file2.txt 10M
切分后的结果为: file1.txt.split1 1-128M / file1.txt.split2 128-256 / file1.txt.split3 256-320 /file2.txt.split1 1-10M

主要影响: 结点硬件环境/运算类型:IO密集型/CPU密集型/运算任务的数据量,

Job的提交流程

  • Job通过Job.getInstance(conf)获取Job对象实例. 随后通过submit()waitForCompletion()提交给JobSubmiter.
  • JobSumiter提交到YarnYarnRunner或本地的LocalUobRunner上.
  • Yarn上获取提交资源的路径StagingDirJobID. 并将其拼接成一个Job提交路径.
  • 通过FileInputFormat.getSplits()方法获取任务切片规划. 并将其序列化成文件job.split拷贝到任务提交目录.
  • 将Job相关参数, 写入一个文件job.xml, 拷贝到Job的提交路径中.
  • 获取Job的运行Jar包, 也提交到响应路径.(通过job.setJar()方法处理.)

MR运行总流程

Mapper处理流程


根据上图我们可以知道, Mapper主要经历如下流程:

  • Mapper通过InputFormat进行读取文件内容;
  • Mappersetup()完成后,按行依次进行map()方法,结束后完成cleanup()方法.
  • 其中, 后续的数据通过context.write()写入OutPutCollector.
Shuffle处理流程

Shuffle流程通常指数据从Mapper端流出,到流入Reducer端的中间过程. 其过程如上图所示, 其主要流程包括:

  • OutputCollector将输出的数据写入环形缓冲区. (注: 环形缓冲区有一个溢出阈值. 默认容量为100M, 溢出指数为0.8. 也就是超过80%就会溢出.)

  • 环形缓冲区内的溢出的数据根据Partiton算法进行分片. 于此同时, 默认根据<key,value>中的key进行排序. (我们可以使其继承CompareWritable值得排序规则.) 随后,将处理后的数据存储到文件内.

  • 之后, 我们对于这些文件做归并排序. 使其合并并有序. 此时, 我们获取的为Maptask的最终结果文件.

  • 之后, 我们将MapTask的最终结果文件, 都在ReduceTask所在的主机上进行下载.(此时,也是一个归并排序). 随后即将进行ReduceTask的过程.
    (在归并的时候, 可以通过GroupingComparator指定key是否相同, 即两个对象是否可以指定在一组.) (此外, 传输的数据是以<key,Iterator>的形式进行传输和处理的.)

  • 补充: 在环形缓冲区写入磁盘文件, 或从磁盘文件下载归并到ReduceTask结点的过程中. 可以使用Combiner进行优化处理过程. 但是, Combiner不能改变原有的业务逻辑. (举例: <1/2=0><1/2=0> -> <2/2=1>这样的合并流程改变了业务逻辑). Combiner具体执行几次, 何时执行, 由系统自己决定.

Reducer处理流程


ReducerTask端, 我们通过下载Shuffle完成后的结果, 进行Reduce的相关逻辑.
主要流程如下:

  • 下载数据, 并做归并操作. (因为其中MapTask处理好的数据可能分部在不同的机器上, 所以需要进行下载操作. 此是耗费资源的操作. 后期的Spark改良了这个过程.) 此外,同样主要数据以<key,Iterator>进行处理.
  • ReduceTask一样,先后运行setup()->map()->cleanup()三个方法.
  • 最终, 将其数据输出至OutputFormat中, OutputFormat通过调用RecordWriter将结果写到相应的位置.
小文件处理
MapTask & ReduceTask个数的指定

通过上述的流程, 我们可以发现. MapTask的数目由你的文件切片规则(默认128M一片), 文件大小决定. 而ReduceTask的个数由Partiton的数据逻辑切片规则决定.
当然, 我们指定job.setReduceTaskNum()的数目要多余数据的逻辑切片数目.(最好是等于.)


Yarn的资源调度过程



任务提交到Yarn的流程主要如下所示:

  • 1- 任务通过Job.submit()方法将其提交到YarnRunner上, 并向Yarn所在的Resource Manager发出提交任务Job的申请.
  • 2- Yarn返回提交的资源路径, 以及ApplicationID.
  • 3- Job通过资源逻辑与ApplicationID整合自身, 对于文件进行切片. 并将切片结果放入等待提交的文件内(a.jar/Job.split/Job.xml).
  • 4- 将Job切片相关文件提交至Yarn上, 请求申请MRApplicationMaster.
  • 5- Yarn将用户的请求合并为一个Task,并将其放入Task执行队列中(FIFO).
  • 6- NodeManager接取任务.
  • 7- NodeManager运行Task, 申请运行容器, 并下载需要的计算的资源.
  • 8- NodeManagerMRApplicationMaster结点向Yarn申请资源, 即运行MapTask的结点.
  • 9- NodeManagerMRApplicationMaster结点获取到资源, 创建MapTask容器.
  • 10- 在申请到资源的结点上运行java -cp. 执行MapTask.
  • 11- MapTask完成后, 又向Yarn申请ReduceTask所需要的资源, 创建容器.
  • 12- ReduceTask容器结点, 获取MapTask的结点作为输入源. 随后进行任务计算. 之后通过OutputFormat进行输出.
    注: Yarn在本架构内只充当资源调度的作用. 其上层结构还可以转变成其他的资源调度. 比如Mesos/K8s.
Hadoop1.x 架构


Hadoop 1.x中, 使用JobTrackerTaskTracker进行调度. 但是从上结构可以发现, 使用的是一个JobTracker. 当运行多个Job的时候, 肯定会导致负载不均衡的问题.

OK, 关于这部分的内容. 我们就先介绍到这边. 图的话有时间自己画一遍, 自己跟一遍源码.

Hadoop MR 核心原理相关推荐

  1. 【大数据】大数据思维的十大核心原理

    感谢博主,转自:https://blog.csdn.net/supermapsupport/article/details/78741774 一.数据核心原理 从"流程"核心转变为 ...

  2. 一文讲透大型网站架构模式核心原理与案例分析

    什么是模式?每一个模式描述了一个在我们周围不断发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复的工作. 也许互联网产品不是随便复制就能成功的,创新的产品更能为用户创造价 ...

  3. 互联网人必读 | 大数据思维的十大核心原理

    2019独角兽企业重金招聘Python工程师标准>>> 大数据思维是客观存在,大数据思维是新的思维观.用大数据思维方式思考问题,解决问题是当下企业潮流.大数据思维开启了一次重大的时代 ...

  4. 读书笔记:大型网站技术架构-核心原理与案例分析

    李智慧<大型网站技术架构-核心原理与案例分析> 性能 可用性 伸缩性 扩展性 安全性 总结 这本书组织的很不错,语言精练,篇幅也不长,对网站架构的要点讲的狠清楚透彻,思路清晰.主要围绕架构 ...

  5. 大数据是什么和大数据技术十大核心原理详解

     一.数据核心原理   从"流程"核心转变为"数据"核心   大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...

  6. Day73_Spark核心原理加强

    一.Spark核心原理加强 ●课程说明 高能预警 Spark源码从1.x的40w行发展到现在的近100w行,有1400多位大牛贡献了代码.整个Spark框架源码是一个巨大的工程, (一)Spark专业 ...

  7. Hadoop大数据原理(2) - 分布式文件系统HDFS

    文章目录 1. 数据存储问题 2. RAID技术的原理和思路 2.1 常用RAID的原理介绍 2.2 RAID间的性能比较 3. 大数据时代的分布式文件系统 3.1 HDFS的稳固地位 3.2 HDF ...

  8. 大数据技术十大核心原理

    一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...

  9. 大数据技术的核心原理

    科学进步越来越多地由数据来推动,海量数据给数据分析既带来了机遇,也构成了新的挑战.大数据往往是利用众多技术和方法,综合源自多个渠道.不同时间的信息而获得的.究竟大数据技术的核心原理是哪几方面呢? 数据 ...

  10. MR的原理和运行流程

    文章目录 MR的原理和运行流程 Map的运行过程 Reduce处理过程 Shuffle过程 MR运行过程 Yarn && Job MR的原理和运行流程 Map的运行过程 以HDFS上的 ...

最新文章

  1. CentOS5.4下安装短信猫
  2. 文巾解题 977. 有序数组的平方
  3. Mustache 中的html转义问题处理
  4. 支持向量机器—SMO算法
  5. Coursera自动驾驶课程第14讲:Linear and Nonlinear Kalman Filters
  6. ubuntu 12.04 mysql_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
  7. 我爱人71年3月出生,档案招工表填成74年了,如何办理退休?
  8. Win7平台下配置Sublime Text2 的C++编译环境
  9. SQL创建数据库– PostgreSQL,MySQL,SQL Server
  10. 网络切片技术缺点_5G中网络切片研究的现状与挑战
  11. php httputils,Android 自定义网络加载工具类 HttpURLConnectionUtils
  12. C++中static关键字用法详解
  13. Android 反编译修改源码
  14. Mirth连接Sybase数据库
  15. 三维全景技术的基本原理,三维全景虚拟现实图片应用
  16. [TI TDA4 J721E] Sensor 鱼眼摄像头 LDC畸变校正模块LUT的创建和生成——详解
  17. SSD接口类型小知识
  18. vue启动报错98% after emitting CopyPlugin This dependency was not found:
  19. Spring boot实训开发个人博客(二)详情页
  20. 【Java】 8.7 使用红-黄-红色渐变来绘制一个填充矩形

热门文章

  1. 【解决】简单有效的使用lodop打印小票功能
  2. 标准差σ未知_标准差σ的4种计算公式
  3. 股票开户天载钢铁等板块跌幅居前
  4. Kvaser—灵活多变的CAN总线接口方案
  5. php进销存bom,金太郎进销存带你了解BOM物料清单
  6. php解决时间超过2038年
  7. 测试3.0u盘速度软件,分享三个3.0 U盘的性能测试,另征集测试
  8. 统计学国内四门B类期刊以及统计学简史
  9. 用vue将数字转为中文大写金额
  10. 地理中经纬度的英文名称