Hadoop大数据平台架构与实践 | MapReduce

2017-04-28  本文已影响258人  拾壹北

课程地址:MapReduce
官方文档:MapReduce Tutorial
参考文献:MapReduce原理与设计思想


目录

0、什么样的计算任务可进行并行化计算?
1、MapReduce的原理
2、MapReduce运行原理
3、上升到构架-自动并行化并隐藏低层细节
4、MapReduce的主要设计思想和特征

0、什么样的计算任务可进行并行化计算?

并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对划分的子任务或数据块同时进行计算。但一些计算问题恰恰无法进行这样的划分!

例如:Fibonacci函数:  Fk+2 = Fk + Fk+1 

前后数据项之间存在很强的依赖关系,只能串行计算!

结论:不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算!

大数据的并行化计算

一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是并行计算。

例如:假设有一个巨大的2维数据需要处理(比如求每个元素的开立方),其中对每个元素的处理是相同的,并且数据元素间不存在数据依赖关系,可以考虑不同的划分方法将其划分为子数组,由一组处理器并行处理。

1、MapReduce的原理:通过分散计算来分析大量数据

MapReduce合并了两种经典函数:

*Input Split(输入分割) -> Map Task(各自统计) -> Shuffle(统计结果交换、规约) -> Reduce Task(统计合并结果) -> Output *

上升到抽象模型:Mapper与Reducer

MPI等并行计算方法缺少高层并行编程模型,为了克服这一缺陷,MapReduce借鉴了Lisp函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型

上升到构架:统一构架,为程序员隐藏系统层细节

MPI等并行计算方法缺少统一的计算框架支持,程序员需要考虑数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节

关键思想:为大数据处理过程中的两个主要处理操作提供一种抽象机制

MapReduce借鉴了函数式程序设计语言Lisp中的思想,定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:

处理:文档数据记录(如文本文件中的行,或数据表格中的行)将以“键值对”形式传入map函数;map函数将处理这些键值对,并以另一种键值对形式输出处理的一组键值对中间结果[(k2; v2)]

输出:键值对[(k2; v2)]表示的一组中间数据

处理:对传入的中间结果列表数据进行某种整理或进一步的处理,并产生最终的某种形式的结果输出[(k3; v3)] 。

输出:最终输出结果[(k3; v3)]

基于Map和Reduce的并行计算模型

2、MapReduce运行原理

Job / Task / Tracker

TaskTracker:负责具体执行计算任务,通常和要处理的DataNode处于同一个节点,这样保证计算是跟着数据走的——“移动计算代替移动数据”;向JobTracker汇报任务状态。

MapReduce作业执行过程
MapReduce作业执行过程

(1)输入数据、分片;
(2)按照一定规则将分片的数据分给Map端的TaskTracker,分配map任务;
(3)map产生的中间结果:key-value对(中间结果写入到本地磁盘),根据映射规则进行交换;
(4)将中间结果传送到Reduce端的TaskTracker,执行Reduce任务;
(5)将最终计算结果写回HDFS;

MapReduce的容错机制

允许TaskTracker出错、发生故障,但保证高可用性

3、上升到构架-自动并行化并隐藏低层细节

如何提供统一的计算框架

MapReduce提供一个统一的计算框架,可完成:

MapReduce最大的亮点:

MapReduce提供的主要功能

4、MapReduce的主要设计思想和特征

(1)向“外”横向扩展,而非向“上”纵向扩展(Scale “out", not “up”)

即MapReduce集群的构筑选用价格便宜、易于扩展的大量低端商用服务器,而非价格昂贵、不易扩展的高端服务器(SMP)。低端服务器市场与高容量Desktop PC有重叠的市场,因此,由于相互间价格的竞争、可互换的部件、和规模经济效应,使得低端服务器保持较低的价格。基于TPC-C在2007年底的性能评估结果,一个低端服务器平台与高端的共享存储器结构的服务器平台相比,其性价比大约要高4倍;如果把外存价格除外,低端服务器性价比大约提高12倍。对于大规模数据处理,由于有大量数据存储需要,显而易见,基于低端服务器的集群远比基于高端服务器的集群优越,这就是为什么MapReduce并行计算集群会基于低端服务器实现。

(2)失效被认为是常态(Assume failures are common)

MapReduce集群中使用大量的低端服务器(Google目前在全球共使用百万台以上的服务器节点),因此,节点硬件失效和软件出错是常态,因而:一个良好设计、具有容错性的并行计算系统不能因为节点失效而影响计算服务的质量,任何节点失效都不应当导致结果的不一致或不确定性;任何一个节点失效时,其它节点要能够无缝接管失效节点的计算任务;当失效节点恢复后应能自动无缝加入集群,而不需要管理员人工进行系统配置。MapReduce并行计算软件框架使用了多种有效的机制,如节点自动重启技术,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。

(3)把处理向数据迁移(Moving processing to the data)

传统高性能计算系统通常有很多处理器节点与一些外存储器节点相连,如用区域存储网络(SAN,Storage Area Network)连接的磁盘阵列,因此,大规模数据处理时外存文件数据I/O访问会成为一个制约系统性能的瓶颈。为了减少大规模数据并行计算系统中的数据通信开销,代之以把数据传送到处理节点(数据向处理器或代码迁移),应当考虑将处理向数据靠拢和迁移。MapReduce采用了数据/代码互定位的技术方法,计算节点将首先将尽量负责计算其本地存储的数据,以发挥数据本地化特点(locality),仅当节点无法处理本地数据时,再采用就近原则寻找其它可用计算节点,并把数据传送到该可用计算节点。

(4)顺序处理数据、避免随机访问数据(Process data sequentially and avoid random access)

大规模数据处理的特点决定了大量的数据记录不可能存放在内存、而只可能放在外存中进行处理。磁盘的顺序访问和随即访问在性能上有巨大的差异。

例:100亿(1010)个数据记录(每记录100B,共计1TB)的数据库,更新1%的记录(一定是随机访问)需要1个月时间;而顺序访问并重写所有数据记录仅需1天时间!

MapReduce设计为面向大数据集批处理的并行计算系统,所有计算都被组织成很长的流式操作,以便能利用分布在集群中大量节点上磁盘集合的高传输带宽。

(5)为应用开发者隐藏系统层细节(Hide system-level details from the application developer)

软件工程实践指南中,专业程序员认为之所以写程序困难,是因为程序员需要记住太多的编程细节(从变量名到复杂算法的边界情况处理),这对大脑记忆是一个巨大的认知负担,需要高度集中注意力。而并行程序编写有更多困难,如需要考虑多线程中诸如同步等复杂繁琐的细节,由于并发执行中的不可预测性,程序的调试查错也十分困难;大规模数据处理时程序员需要考虑诸如数据分布存储管理、数据分发、数据通信和同步、计算结果收集等诸多细节问题。MapReduce提供了一种抽象机制将程序员与系统层细节隔离开来,程序员仅需描述需要计算什么(what to compute), 而具体怎么去做(how to compute)就交由系统的执行框架处理,这样程序员可从系统层细节中解放出来,而致力于其应用本身计算问题的算法设计。

(6)平滑无缝的可扩展性(Seamless scalability)

主要包括两层意义上的扩展性:数据扩展和系统规模扩展。理想的软件算法应当能随着数据规模的扩大而表现出持续的有效性,性能上的下降程度应与数据规模扩大的倍数相当。在集群规模上,要求算法的计算性能应能随着节点数的增加保持接近线性程度的增长。绝大多数现有的单机算法都达不到以上理想的要求;把中间结果数据维护在内存中的单机算法在大规模数据处理时很快失效;从单机到基于大规模集群的并行计算从根本上需要完全不同的算法设计。奇妙的是,MapReduce几乎能实现以上理想的扩展性特征。 多项研究发现基于MapReduce的计算性能可随节点数目增长保持近似于线性的增长。

上一篇下一篇

猜你喜欢

热点阅读