博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapReduce原理
阅读量:4230 次
发布时间:2019-05-26

本文共 4217 字,大约阅读时间需要 14 分钟。

MapReduce模型主要包含Mapper类和Reducer类两个抽象类。Mapper类主要负责对数据的分析处理,最终转化为key-value数据对;Reducer类主要获取key-value数据对,然后处理统计,得到结果。

MapReduce 框架的核心步骤主要分两部分:Map 和Reduce。当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。MapReduce实现了存储的均衡,但没有实现计算的均衡。

一. MapReduce框架组成

MapReduce主要包括JobClient、JobTracker、TaskTracker、HDFS四个独立的部分。1、JobClient
配置参数Configuration,并打包成jar文件存储在HDFS上,将文件路径提交给JobTracker的master服务,然后由master创建每个task将它们分发到各个TaskTracker服务中去执行。
2、JobTracker
  这是一个master服务,程序启动后,JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker和job的健康状况,一旦发生失败,即将之转移到其他节点上,同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。
3、TaskTracker
  运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信接受作业,并负责直接执行每个任务。TaskTracker 会周期性地通过Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop 调度器的作用就是将各个TaskTracker 上的空闲slot 分配给Task 使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用。TaskTracker 通过slot 数目(可配置参数)限定Task 的并发度。
Task分为Map Task和Reduce Task两种,均由TaskTracker启动。HDFS以block块存储数据,mapreduce处理的最小数据单位为split。split如何划分又用户自由设置。如下为split和block之间的关系:

4.HDFS

保存数据和配置信息等。

二、MapReduce程序运行过程

作业运行过程:

1.程序要运行一个job
2.3.4 Jobclient首先向JobTracker请求一个新的作业ID;然后检查输出说明(如输出目录已存在)、输出划分(如输入路径不存在),为JobTracker配置好所有需要的资源,然后把作业放入到一个内部的队列中,提交job给JobTracker.
5.jobtracker对其进行初始化,初始化包括创建一个代表该正在运行的作业对象(封装任务和记录信息),以便跟踪任务的状态和进程;作业调度器获取分片信息,每个分片创建一个map任务。
7.TaskTracker会执行一个简单的循环定期发送heartbeat给JobTracker,心跳间隔可自由设置,通过心跳JobTracker可以监控TaskTracker是否存活,同时也能获得TaskTracker处理的状态和问题,同时也能计算出整个Job的状态和进度。当JobTracker获得了最后一个完成指定任务的TaskTracker操作成功的通知时候,JobTracker会把整个Job状态置为成功,然后当客户端查询Job运行状态时候(注意:这个是异步操作),客户端会查到Job完成的通知的。

逻辑角度分析作业运行顺序:

输入分片(input split)、map阶段、combiner阶段、shuffle阶段、reduce阶段。
input split:在map计算之前,程序会根据输入文件计算split,每个input split针对一个map任务。input split存储的并非是数据本身,而是一个分片长度和一个记录数据的位置的数组。
map阶段:即执行map函数。
combiner阶段([kəm’bainə]组合阶段):这是一个可选择的函数,实质上是一种reduce操作。combiner是map的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作。
shuffle阶段([‘ʃʌf(ə)l]):指从map输出开始,包括系统执行排序即传送map输出到reduce作为输入的过程。另外针对map输出的key进行排序又叫sort阶段。map端shuffle,简单来说就是利用combiner对数据进行预排序,利用内存缓冲区来完成。reduce端的shuffle包括复制数据和归并数据,最终产生一个reduce输入文件。shuffle过程有许多可调优的参数来提高MapReduce的性能,其总原则就是给shuffle过程尽量多的内存空间。
reduce阶段:即执行reduce函数并存到hdfs文件系统中。

作业调度器:

目前hadoop的作业调度器主要有三种:
先进先出调度器:
优点,算法简单,JobTracker工作负担轻;缺点忽略不同作业的需求差异。
容量调度器
公平调度器

MapReduce容错

hadoop的好处之一就是能处理输入进程崩溃、机器故障、代码错误等问题并能成功运行完成任务。

三.MapReduce的核心过程—-Shuffle和Sort

Shuffle是指从Map产生输出开始,包括系统执行排序以及传送Map输出到Reducer作为输入的过程。

Map端的shuffle

当Map开始产生输出的时候,他并不是简单的把数据写到磁盘,因为频繁的操作会导致性能严重下降,他的处理更加复杂,数据首先是写到内存中的一个缓冲区,并作一些预排序,以提升效率。

每个Map任务都有一个用来写入输出数据的循环内存缓冲区,这个缓冲区默认大小是100M,可以通过io.sort.mb属性来设置具体的大小,当缓冲区中的数据量达到一个特定的阀值(io.sort.mb * io.sort.spill.percent,其中

io.sort.spill.percent 默认是0.80)时,系统将会启动一个后台线程把缓冲区中的内容spill(溢出)到磁盘。

而且(多线程)。Spill文件保存在由mapred.local.dir指定的目录中,Map任务结束后删除。

spill线程在把缓冲区的数据写到磁盘前,会对他进行一个二次排序,首先根据数据所属的partition排序,然后每个partition中再按Key排序。输出包括一个索引文件和数据文件。

每当内存中的数据达到spill阀值的时候,都会产生一个新的spill文件,所以在spill过程中Map的输出将会继续写入到缓冲区,同时Map任务完成后可能会有多个spill文件,在Map任务完成前,所有的spill文件将会被归并排序为一个索引文件和数据文件。并且Spill文件保存在由mapred.local.dir指定的目录中,Map任务结束后删除。

当spill 文件归并完毕后,Map 将删除所有的临时spill 文件,并告知

TaskTracker 任务已完成。Reducers 通过HTTP 来获取对应的数据。用来传输partitions 数据的工作线程个数由tasktracker.http.threads 控制,这个设定是针对每一个TaskTracker 的,并不是单个Map,默认值为40,在运行大作业的大集群上可以增大以提升数据传输速率。

如果设定了Combiner,将在排序输出的基础上进行,在写入磁盘之前进行数据的压缩。Combiner就是一个Mini Reducer,它在执行Map任务的节点本身运行,先对Map的输出作一次简单的Reduce,使得Map的输出更紧凑,更少的数据会被写入磁盘和传送到Reducer。

Reduce的shuffle

Map的输出文件放置在运行Map任务的TaskTracker的本地磁盘上(注意:Map输出总是写到本地磁盘,但是Reduce输出不是,一般是写到HDFS),它是运行Reduce任务的TaskTracker所需要的输入数据。Reduce任务的输入数据分布在集群内的多个Map任务的输出中,Map任务可能会在不同的时间内完成,只要有其中一个Map任务完成,Reduce任务就开始拷贝他的输出。这个阶段称为拷贝阶段,Reduce任务拥有多个拷贝线程,可以并行的获取Map输出。可以通过设定mapred.reduce.parallel.copies来改变线程数。

Reduce是怎么知道从哪些TaskTrackers中获取Map的输出呢?当Map任务完成之后,会通知他们的父TaskTracker,告知状态更新,然后TaskTracker再转告JobTracker,这些通知信息是通过心跳通信机制传输的,因此针对以一个特定的作业,jobtracker知道Map输出与tasktrackers的映射关系。Reducer中有一个线程会间歇的向JobTracker询问Map输出的地址,直到把所有的数据都取到。在Reducer取走了Map输出之后,TaskTracker不会立即删除这些数据,因为Reducer可能会失败,他们会在整个作业完成之后,JobTracker告知他们要删除的时候才去删除。

转载地址:http://boiqi.baihongyu.com/

你可能感兴趣的文章
Red Hat Fedora Core 6 Unleashed
查看>>
Windows Presentation Foundation Unleashed
查看>>
Live Linux(R) CDs: Building and Customizing Bootables
查看>>
Snort Intrusion Detection and Prevention Toolkit
查看>>
Programming Wcf Services
查看>>
AppleScript: The Comprehensive Guide to Scripting and Automation on Mac OS X, Second Edition
查看>>
Pro Open Source Mail: Building an Enterprise Mail Solution
查看>>
Visual SourceSafe 2005 Software Configuration Management in Practice
查看>>
Beginning EJB 3 Application Development: From Novice to Professional
查看>>
Google Web Toolkit: GWT Java Ajax Programming
查看>>
Breakthrough Windows Vista(TM): Find Your Favorite Features and Discover the Possibilities
查看>>
Windows Powershell in Action
查看>>
Functional And Object Oriented Analysis And Design: An Integrated Methodology
查看>>
The Debugger's Handbook
查看>>
Using Samba
查看>>
XML Security
查看>>
Rails Cookbook
查看>>
Dynamic HTML: The Definitive Reference (Dynamic Html) [ILLUSTRATED]
查看>>
Python (Visual QuickStart Guide)
查看>>
SCJP Sun Certified Programmer for Java 5 Study Guide
查看>>