前文回顾:HDFS分布式文件系统
目录
对付大数据处理:分而治之
大数据的并行化计算
大数据任务划分和并行计算模型
构建抽象模型:Map和Reduce
关键思想
Map
Reduce
抽象描述
Map:(k1;v1) → [(k2;v2)]
Reduce:(k2;[v2]) → [(k3;v3)]
并行计算模型
上升到构架:自动并行化并隐藏低层细节
MapReduce的最大亮点
MapReduce提供的主要功能
任务调度
数据/代码互定位
出错处理
分布式数据存储与文件管理
合并处理
MapReduce的主要设计思想和特征
向“外”横向扩展,而非向“上”纵向扩展
失效被认为是常态
把处理向数据迁移
顺序处理数据、避免随机访问数据
为应用开发者隐藏系统层细节(最大亮点)
平滑无缝的可扩展性
Hadoop MapReduce的基本工作原理
Hadoop MapReduce基本框架与工作过程
Hadoop MapReduce主要组件
文件输入格式InputFormat
输入数据分片InputSplits
数据记录读入RecordReader
处理数据Mapper
合并操作Combiner
洗牌Partitioner & shuffle
整理Reducer
文件输出格式OutputFormat
程序执行时的容错处理与计算性能优化
不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算。
一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是并行计算。
为大数据处理过程中的两个主要处理过程提供一种抽象机制。Map,对一组数据元素进行某种重复式的处理,Reduce,对Map的中间结果进行某种进一步的整合
MapReduce借鉴了Lisp中的思想,定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现。Map和Reduce为程序员提供一个清晰的操作接口抽象描述。
(图片来源乔诺『布菲』)
Map Reduce提供一个统一的计算框架,可完成:
- 计算任务的划分和调度
- 数据的分布存储和划分
- 处理数据与计算任务的同步
- 结果数据的收集整理(sorting,combining,partitioning,...)
- 系统通信,、负载平衡、计算性能优化处理
- 处理系统节点出错检测和失效恢复
提交的一个计算作业(job)将被划分为很多个计算任务(tasks)。任务调度功能主要负责为这些划分后的计算任务分配和调度计算节点(map节点或reduce节点);同时负责监控这些节点的执行状态,并负责map节点执行的同步控制(barrier);也负责进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行,选最快完成者作为结果
为了减少数据通信,一个基本原则是本地化数据处理(locality),即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化数据处理时,再寻找其它可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。
以低端商用服务器构成的大规模Map Reduce计算集群中节点硬件(主机、磁盘、内存等)出错和软件有bug是常态,因此,Map Reduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。
海量数据处理需要一个良好的分布数据存储和文件管理系统支撑。该文件系统能够把海量数据分布存储在各个节点的本地磁盘上,但保持整个数据在逻辑上成为一个完整的数据文件;为了提供数据存储容错机制,该文件系统还要提供数据块的多备份存储管理能力。
为了减少数据通信开销,中间结果数据做shuffle前需要进行合并(combine)处理,把具有同样主键的数据合并到起避免重复传送:一个reduce节点所处理的数据可能会来自多个map节点,因此,map节点输出的中间结果需使用一定的策略进行适当的划分(partitioner,即shuffle)处理,保证相关数据发送到同一个reducer节点。
Map Reduce集群的构筑选用价格便宜、易于扩展的大量低端商用服务器,而非价格昂贵、不易扩展的高端服务器。
低端服务器市场与高容量Desktop PC有重叠的市场,因此,由于相互间价格的竞争、可互换的部件、和规模经济效应,使得低端服务器保持较低的价格基于TPC-C在2007年底的性能评估结果,一个低端服务器平台与高端的共享存储器结构的服务器平台相比,其性价比大约要高4倍;如果把外存价格除外,低端服务器性价比大约提高12倍。对于大规模数据处理,由于有大量数据存储需要,显而易见基于低端服务器的集群远比基于高端服务器的集群优越,这就是为什么Map Reduce并行计算集群会基宇低端服务器实现。
MapReduce集群中使用大量的低端服务器,因此,节点硬件失效和软件出错是常态。(HDFS也有相应的可靠性设计,详见前文)
- 一个良好设计、具有容错性的并行计算系统不能因为节点失效而影响计算服务的质量,任何节点失效都不应当导致结果的不一致或不确定性;
- 任何一个节点失效时,其它节点要能够无缝接管失效节点的计算任务;
- 当失效节点恢复后应能自动无缝加入集群,而不需要管理员人工进行系统配置。
为了减少大规模数据并行计算系统中的数据通信开销,代之以把数据传送到处理节点(数据向处理器或代码迁移),应当考虑将处理向数据靠拢和迁移。
MapReduce采用了数据/代码互定位的技术方法,计算节点将首先将尽量负责计算其本地存储的数据,以发挥数据本地化特点(locality),仅当节点无法处理本地数据时,再采用就近原 则寻找其它可用计算节点,并把数据传送到该可用计算节点。
大规模数据处理的特点决定了大量的数据记录不可能存放在内存,而只可能放在外存中进行处理。磁盘的顺序访问和随机访问在性能上有巨大的差异。
MapReduce设计为面向大数据集批处理的并行计算系统,所有计算都被组织成很长的流式操作,以便能利用分布在集群中大量节点上磁盘集合的高传输带宽。
数据存储与计算节点框架
定义了数据文件如何分割和读取。InputFormat提供了以下一些功能:
InputSplit定义了输入到单个Map任务的输入数据
InputSplit定义了一个数据分片,但是没有定义如何读取数据记录。RecordReader实际上定义了如何将数据记录转化为一个(key,value)对的详细方法,并将数据记录传给Mapper类。
TextInputFormat提供了LineRecordReader,读入一个文本行数据记录。
Sort:传输到每一个Reducer节点上的Key,value对会被Hadoop自动排序(即Map生成的结果传送到某一个节点的时候,会被自动排序)
做用户定义的Reduce操作。
Reducer.Context用来获得环境参数、 设置当前执行的状态、 输出结果等。