Hadoop组件之MapReduce框架
此处的介绍不是书上的抄写,只作理解为主,所以请谅解语言用词的精确性。而且不可能用一篇文章就学会MapReduce 框架,仅作为引导。
认识MapReduce
MapReduce是一种编程模型,用于大规模数据集的离线式并行运算。关于实时计算用storm和spark,后面会介绍。"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。"Map(映射)"和"Reduce(归约)”会结合后面的例子介绍。
MapReduce提供的主要功能
1)数据划分和计算任务调度:
系统自动将一个作业(Job)待处理的大数据划分为很多个数据块,每个数据块对应于一个计算任务(Task),并自动 调度计算节点来处理相应的数据块。作业和任务调度功能主要负责分配和调度计算节点(Map节点或Reduce节点),同时负责监控这些节点的执行状态,并 负责Map节点执行的同步控制。
2)数据/代码互定位:
为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向 数据的迁移;当无法进行这种本地化数据处理时,再寻找其他可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻 找可用节点以减少通信延迟。
3)系统优化:
为了减少数据通信开销,中间结果数据进入Reduce节点前会进行一定的合并处理;一个Reduce节点所处理的数据可能会来自多个 Map节点,为了避免Reduce计算阶段发生数据相关性,Map节点输出的中间结果需使用一定的策略进行适当的划分处理,保证相关性数据发送到同一个 Reduce节点;此外,系统还进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行、选最快完成者作为结果。
4)出错检测和恢复:
以低端商用服务器构成的大规模MapReduce计算集群中,节点硬件(主机、磁盘、内存等)出错和软件出错是常态,因此 MapReduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。同时,系统还将维护数据存储的可靠性,用多备份冗余存储机制提 高数据存储的可靠性,并能及时检测和恢复出错的数据。
MapReduce设计上特征
1)向“外”横向扩展,而非向“上”纵向扩展
对于大规模数据处理,由于有大量数据存储需要,显而易见,基于低端服务器的集群远比基于高端服务器的集群优越,这就是为什么MapReduce并行计算集群会基于低端服务器实现的原因。
2)失效被认为是常态
MapReduce集群中使用大量的低端服务器,因此,节点硬件失效和软件出错是常态,MapReduce并行计算软件框架使用了多种有效的错误检测和恢复机制,如节点自动重启技术,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。
3)处理偏向数据
传统高性能计算系统通常有很多处理器节点与一些外存储器节点相连,如用存储区域网络(Storage Area,SAN Network)连接的磁盘阵列,大规模数据处理时外存文件数据I/O访问会成为一个制约系统性能的瓶颈。MapReduce采用了数据/代码互定位的技术方法,计算节点将首先尽量负责计算其本地存储的数据,以发挥数据本地化特点,仅当节点无法处理本地数据时,再采用就近原则寻找其他可用计算节点,并把数据传送到该可用计算节点。
4)顺序处理数据、避免随机访问数据
为了实现面向大数据集批处理的高吞吐量的并行处理,MapReduce可以利用集群中 的大量数据存储节点同时访问数据,以此利用分布集群中大量节点上的磁盘集合提供高带宽的数据访问和传输。
5)为应用开发者隐藏系统层细节
MapReduce提供了一种抽象机制将程序员与系统层细节隔离开来,程序员仅需描述需要计算什么(What to compute),而具体怎么去计算(How to compute)就交由系统的执行框架处理,这样程序员可从系统层细节中解放出来,而致力于其应用本身计算问题的算法设计。
6)平滑无缝的可扩展性
这里指出的可扩展性主要包括两层意义上的扩展性:数据扩展和系统规模扩展性。
理想的软件算法应当能随着数据规模的扩大而表现出持续的有效性,性能上的下降程度应与数据规模扩大的倍数相当;在集群规模上,要求算法的计算性能应能随着节点数的增加保持接近线性程度的增长。
MapReduce组件
MapReduce的必备组件:
•驱动器(Driver) : 负责初始化一个MapReduce作业并定义特定作业的运行环境配置,通过 driver还可以获取作业执行的状态;
•上下文(Context) : 在MapReduce作业执行的任何阶段都可用,提供了一种方便的机制可以用来交换作业运行所需系统和作业范围信息;
•输入数据: MapReduce 作业的输入数据最初被保存的地方;
•输入格式: 定义了输入数据如何被读取和切分;
•输入切分: 定义了MapReduce程序中单个map任务的工作单元;
•输出格式: 管控着作业输出的写方式;
•RecordReader: RecordReader类实际是从其数据源读取数据并将该数据转换成适合被mapper处理的键值对,然后将这些键值对传递给map方法;
•Mapper: mapper执行MapReduce程序第一阶段的用户自定义动作;
•分区: Partitioner 类决定了一个给定的键值对将被发到哪个reducer,默认的Partitioner 为每个键计算哈希值并基于该结果分配分区;
•Shuffle: 将map输出移动到对应的reducers的过程称为shuffling;
•RecordWriter: RecordWriter 定义了单个输出如何被写入;
•排序: 对于指定reducer,任务计算的中间结果键值对集合在送往该reducer之前,Hadoop就会自动对其排序。
以下为MapReduce的可选组件:
•组合器: 组合器通常在reducer之前,mapper之后运行。一个Combiner类的实例通常在每个map任务和一些reduce任务中运行,组合器接收mapper实例分发的数据作为输入,并尝试将相同的键对应的值组合,从而缩小了键空间也减小了需要存储的键的数量,组合器的输出先被 排序然后分发到reducers;
• 分布式缓存: 这个设计允许在集群中的所有节点上进行数据共享,分布式缓存应该是可以被每个任务访问的共享库,一个保存着键值对的全局查询文件,包含着可执行代码的jar文件等,缓存会将文件拷贝至实际执行的机器上,并保证本地可用。
此图为MapReduce框架中的各组件及各组件间的关系。
MapReduce的作业提交
两种 APIs使用方式,通过使用Job对象来提交