大数据|MapReduce模型 | Hadoop MapReduce的基本工作原理
Posted 啦啦右一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据|MapReduce模型 | Hadoop MapReduce的基本工作原理相关的知识,希望对你有一定的参考价值。
前文回顾:HDFS分布式文件系统
目录
📚对付大数据处理:分而治之
🐇大数据的并行化计算
不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算。
一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是并行计算。
🐇大数据任务划分和并行计算模型
📚构建抽象模型:Map和Reduce
🐇关键思想
为大数据处理过程中的两个主要处理过程提供一种抽象机制。Map,对一组数据元素进行某种重复式的处理,Reduce,对Map的中间结果进行某种进一步的整合
🥕Map
- 大量数据记录/元素进行重复处理
- 对每个数据记录/元素作感兴趣的处理、获取感兴趣的中间结果信息
🥕Reduce
- 排序和整理中间结果
- 收集整理中间结果,产生最终结果输出
🐇抽象描述
MapReduce借鉴了Lisp中的思想,定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现。Map和Reduce为程序员提供一个清晰的操作接口抽象描述。
🥕Map:(k1;v1) → [(k2;v2)]
- 输入:键值对(k1; v1)表示的数据
- 处理:文档数据记录(如文本文件中的行,或数据表格中的行)将以“键值对”形式传入map函数;map函数将处理这些键值对,并以另一种键值对形式输出处理的一组键值对中间结果[(k2; v2)]
- 输出:键值对[(k2; v2)]表示的一组中间数据
🥕Reduce:(k2;[v2]) → [(k3;v3)]
- 输入: 由map输出的一组键值对[(k2; v2)] 将被进行合并处理,将同样主键下的不同数值合并到一个列表[v2]中,故reduce的输入为(k2; [v2])
- 处理:对传入的中间结果列表数据进行某种整理或进一步处理,并产生最终的某种形式的结果输出[(k3; v3)] 。
- 输出:最终输出结果[(k3; v3)]
🐇并行计算模型
- 各个map函数对所划分的数据并行处理,从不同的输入数据产生不同的中间结果输出
- 各个reduce也各自并行计算,各自负责处理不同的中间结果数据集合
- 进行reduce处理之前,必须等到所有的map函数做完。因此,在进入reduce前需要有一个同步障(barrier);这个阶段也负责对map的中间结果数据进行收集整理(aggregation & shuffle)处理,以便reduce更有效地计算最终结果
- 最终汇总所有reduce的输出结果即可获得最终结果
例:Wordcount过程示意图
(图片来源乔诺『布菲』)
📚上升到构架:自动并行化并隐藏低层细节
🐇MapReduce的最大亮点
Map Reduce提供一个统一的计算框架,可完成:
- 计算任务的划分和调度
- 数据的分布存储和划分
- 处理数据与计算任务的同步
- 结果数据的收集整理(sorting,combining,partitioning,...)
- 系统通信,、负载平衡、计算性能优化处理
- 处理系统节点出错检测和失效恢复
- 通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架
- 程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的程序代码
- 如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小到单个节点集群的自动调度使用
🐇MapReduce提供的主要功能
🥕任务调度
提交的一个计算作业(job)将被划分为很多个计算任务(tasks)。任务调度功能主要负责为这些划分后的计算任务分配和调度计算节点(map节点或reduce节点);同时负责监控这些节点的执行状态,并负责map节点执行的同步控制(barrier);也负责进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行,选最快完成者作为结果
🥕数据/代码互定位
为了减少数据通信,一个基本原则是本地化数据处理(locality),即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化数据处理时,再寻找其它可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。
🥕出错处理
以低端商用服务器构成的大规模Map Reduce计算集群中节点硬件(主机、磁盘、内存等)出错和软件有bug是常态,因此,Map Reduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。
🥕分布式数据存储与文件管理
海量数据处理需要一个良好的分布数据存储和文件管理系统支撑。该文件系统能够把海量数据分布存储在各个节点的本地磁盘上,但保持整个数据在逻辑上成为一个完整的数据文件;为了提供数据存储容错机制,该文件系统还要提供数据块的多备份存储管理能力。
🥕合并处理
为了减少数据通信开销,中间结果数据做shuffle前需要进行合并(combine)处理,把具有同样主键的数据合并到起避免重复传送:一个reduce节点所处理的数据可能会来自多个map节点,因此,map节点输出的中间结果需使用一定的策略进行适当的划分(partitioner,即shuffle)处理,保证相关数据发送到同一个reducer节点。
📚MapReduce的主要设计思想和特征
🐇向“外”横向扩展,而非向“上”纵向扩展
Map Reduce集群的构筑选用价格便宜、易于扩展的大量低端商用服务器,而非价格昂贵、不易扩展的高端服务器。
低端服务器市场与高容量Desktop PC有重叠的市场,因此,由于相互间价格的竞争、可互换的部件、和规模经济效应,使得低端服务器保持较低的价格基于TPC-C在2007年底的性能评估结果,一个低端服务器平台与高端的共享存储器结构的服务器平台相比,其性价比大约要高4倍;如果把外存价格除外,低端服务器性价比大约提高12倍。对于大规模数据处理,由于有大量数据存储需要,显而易见基于低端服务器的集群远比基于高端服务器的集群优越,这就是为什么Map Reduce并行计算集群会基宇低端服务器实现。
🐇失效被认为是常态
MapReduce并行计算软件框架使用了多种有效的机制,如 节点自动重启技术 ,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。MapReduce集群中使用大量的低端服务器,因此,节点硬件失效和软件出错是常态。(HDFS也有相应的可靠性设计,详见前文)
- 一个良好设计、具有容错性的并行计算系统不能因为节点失效而影响计算服务的质量,任何节点失效都不应当导致结果的不一致或不确定性;
- 任何一个节点失效时,其它节点要能够无缝接管失效节点的计算任务;
- 当失效节点恢复后应能自动无缝加入集群,而不需要管理员人工进行系统配置。
🐇把处理向数据迁移
为了减少大规模数据并行计算系统中的数据通信开销,代之以把数据传送到处理节点(数据向处理器或代码迁移),应当考虑将处理向数据靠拢和迁移。
MapReduce采用了数据/代码互定位的技术方法,计算节点将首先将尽量负责计算其本地存储的数据,以发挥数据本地化特点(locality),仅当节点无法处理本地数据时,再采用就近原 则寻找其它可用计算节点,并把数据传送到该可用计算节点。
🐇顺序处理数据、避免随机访问数据
大规模数据处理的特点决定了大量的数据记录不可能存放在内存,而只可能放在外存中进行处理。磁盘的顺序访问和随机访问在性能上有巨大的差异。
MapReduce设计为面向大数据集批处理的并行计算系统,所有计算都被组织成很长的流式操作,以便能利用分布在集群中大量节点上磁盘集合的高传输带宽。
🐇为应用开发者隐藏系统细节(最大亮点)
MapReduce提供了一种抽象机制将 程序员与系统层细节隔离开 来,程序员仅需描述需要计算什么(what to compute), 而具体怎么去做 (how to compute)就交由系统的执行框架处理,这样程序员可从系统层细节中解放出来,而致力于其应用本身计算问题的算法设计。 详见上文。🐇平滑无缝的可拓展性
主要包括两层意义上的扩展性:数据扩展和系统规模扩展。在集群规模上,要求算法的计算性能应能随着节点数的增加保持接近线性程度的增长 。而多项研究发现基于MapReduce的 计算性能可随节点数目增长保持近似于线性的增长📚Hadoop MapReduce的基本工作原理🌟
数据存储与计算节点框架
🐇Hadoop MapReduce基本框架与工作过程
🐇Hadoop MapReduce主要组件
🥕文件输入格式InputFormat
定义了数据文件如何分割和读取。InputFormat提供了以下一些功能:
- 选择文件或者其它对象,用来作为输入
- 定义InputSplits, 将一个文件分为不同任务
- 为RecordReader提供一个基础,用来读取这个文件
- 有一个抽象的类FileInputFormat,所有的输入格式类都从这个类继承其功能以及特性。当启动一个Hadoop任务的时候,一个输入文件所在的目录被输入到FileInputFormat对象中。
- FileInputFormat从这个目录中读取所有文件。然后FileInputFormat将这些文件分割为多个InputSplits。通过在JobConf对象上设置JobConf.setInputFormat设置文件输入的格式:
🥕输入数据分片InputSplits
InputSplit定义了输入到单个Map任务的输入数据
- 一个MapReduce程序被统称为一个Job,可能有上百个任务构成。
- InputSplit将文件分为64MB的大小。配置文件hadoop-site.xml中的mapred.min.split.size参数控制这个大小。
- mapred.tasktracker.map.taks.maximum 用来控制某一个节点上所有 map 任务的最大数目。
🥕数据记录读入RecordReader
InputSplit定义了一个数据分片,但是没有定义如何读取数据记录。RecordReader实际上定义了如何将数据记录转化为一个(key,value)对的详细方法,并将数据记录传给Mapper类。
TextInputFormat提供了LineRecordReader,读入一个文本行数据记录。
🥕处理数据Mapper
每一个Mapper类的实例生成了一个Java进程,负责处理某一个InputSplit上的数据。使用 Mapper.Context 提供给每一个Mapper函数,用来获得环境参数、设置当前执行的状态、收集中间结果等。🥕合并操作Combiner
合并相同key的键值对,减少partitioning时候的数据通信开销。
用户可以使用JobConf.setCombinerClass(class)自定制Combiner。
🥕洗牌Partitioner & shuffle
在Map工作完成之后,每一个Map函数会将结果传到对应的Reducer所在的点,此时,用户可以 提供一个Partitioner类,用来决定一个给定的(key,value)对传给哪个Reduce节点。Sort:传输到每一个Reducer节点上的Key,value对会被Hadoop自动排序(即Map生成的结果传送到某一个节点的时候,会被自动排序)
🥕整理Reducer
做用户定义的Reduce操作。
Reducer.Context用来获得环境参数、 设置当前执行的状态、 输出结果等。
🥕文件输出格式OutputFormat
写入到HDFS的所有OutputFormat都继承自FileOutputFormat。每一个Reducer都写一个文件到一个共同的输出目录。RecordWriter: TextOutputFormat实现了缺省的LineRecordWriter,以”key\\t value ”形式输出一行结果。
🐇程序执行时的容错处理与计算性能优化
- 由Hadoop系统自己解决
- 主要方法是将失败的任务进行再次执行
- TaskTracker会把状态信息汇报给JobTracker,最终由JobTracker决定重新执行哪一个任务
- 为了加快执行的速度,Hadoop也会自动重复执行同一个任务,以最先执行成功的为准(投机执行)。
2021年大数据Hadoop(十六):MapReduce计算模型介绍
全网最详细的Hadoop文章系列,强烈建议收藏加关注!
后面更新文章都会列出历史文章目录,帮助大家回顾知识重点。
目录
本系列历史文章
2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation
2021年大数据Hadoop(十三):HDFS意想不到的其他功能
2021年大数据Hadoop(十一):HDFS的元数据辅助管理
2021年大数据Hadoop(八):HDFS的Shell命令行使用
2021年大数据Hadoop(七):HDFS分布式文件系统简介
2021年大数据Hadoop(六):全网最详细的Hadoop集群搭建
2021年大数据Hadoop(二):Hadoop发展简史和特性优点
2021年大数据Hadoop(一):Hadoop介绍
前言
2021年全网最详细的大数据笔记,轻松带你从入门到精通,该栏目每天更新,汇总知识分享
MapReduce计算模型介绍
理解MapReduce思想
MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。
这两个阶段合起来正是MapReduce思想的体现。
图:MapReduce思想模型
还有一个比较形象的语言解释MapReduce:
我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。
现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。
MapReduce的运行需要由Yarn集群来提供资源调度。
Hadoop MapReduce设计构思
MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop的yarn集群上。
既然是做计算的框架,那么表现形式就是有个输入(input),MapReduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output)。
对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而MapReduce就是一种简化并行计算的编程模型,降低了开发并行应用的入门门槛。
Hadoop MapReduce构思体现在如下的三个方面:
如何对付大数据处理:分而治之
对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对划分的子任务或数据块同时进行计算。不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算!
构建抽象模型:Map和Reduce
MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型。
Map: 对一组数据元素进行某种重复式的处理;
Reduce: 对Map的中间结果进行某种进一步的结果整理。
MapReduce中定义了如下的Mapper和Reducer两个抽象的编程接口,由用户去编程实现:
map: (k1; v1) → [(k2; v2)]
reduce: (k2; [v2]) → [(k3; v3)]
Map和Reduce为程序员提供了一个清晰的操作接口抽象描述。通过以上两个编程接口,大家可以看出MapReduce处理的数据类型是<key,value>键值对。
统一构架,隐藏系统层细节
如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。
MapReduce最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的程序代码。如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小到单个节点集群的自动调度使用。
以上是关于大数据|MapReduce模型 | Hadoop MapReduce的基本工作原理的主要内容,如果未能解决你的问题,请参考以下文章