hadoop1中mapreduce原理详解
剖析Mapreduce作业运行机制:原理如下图:
原理图的解释的可以分为以下几个部分
1、客户端提交一个mapreduce的jar包给JobClient
2、JocClient通过RPC和JobTracker进行通信,返回一个存放jar包的地址(HDFS)
3、JobClient将jar包写入到HDFS当中(path=hdfs上的地址(这个地址是有第二步的JobTracker返回的)+JobId)
将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门 为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个 作业启动多少个map任务等信息
4、开始提交任务(任务的描述信息:包括jobid,jar存放的位置,配置信息等等)
JobClient调用JobTracker的submitJob()方法提交任务
5、JobTracker进行初始化任务
JobTracker会把提交的作业放在一个内部队列中,交由作业调度器来进行调度,任务的初始化包括创建一个表示运行的作业的对象——封装任务和记录信息,以便跟踪 任务的状态和信息。
6、读取HDFS上要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask
当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个切片启动一个MapperTask任务
7、TaskTracker通过心跳机制领取任务(任务的描述信息)
map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的的TaskTracker上。同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。TaskTracker每隔一段时间会给 JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户
8、下载所需的jar,配置文件
9、TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
map函数端的执行过程:
a:每个输入分片会让一个map任务处理,默认情况下,以HDFS的一个快的大小为一个分片,map输出的结果暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort。spill。percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区的数据写入这个文件
b:在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据,这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分配到很少数据,其实分区就是对数据进行hash的过程,然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combiner操作,这样做的目的是让尽可能少的数据写入到磁盘。
c:当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并,合并的过程会不断的进行排序和Combiner操作,目的有两个:1、尽量减少每次写入磁盘的数据量,2、尽量减少下一次复制阶段网络传输的数据量,最后合并成一个已分区已排序的文件,为了减少网络传输的数据量,可以将数据进行雅俗,只要将mapred.compress.map.out设置为true就行了
d:将分区中的数据拷贝给相对应的reduce任务,有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就ok了哦。
reduce函数端执行过程
a:reduce会收到不同map任务传来的数据,并且每个map传来的数据都是有序的,如果reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.buffer.percent决定),则对数据合并后溢写到磁盘中。
b:伴随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间,其实不管在map端还是reduce端,MapReduce都是反复的执行排序,合并操作,
c:合并的过程中会产生许多的中间文件(写入磁盘了),但MaoReduce会让写入磁盘的数据尽可能的少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。
10、将结果写入到HDFS当中
hadoop1中mapreduce原理详解的更多相关文章
- hadoop1中hdfs原理详解
HDFS是Hadoop Distribute File System的简称,也是Hadoop的一个分布四文件系统 一.HDFS的主要设计理念 1.存储超大文件 这里的 “超大文件” 是指几百MB .G ...
- Java中多线程原理详解
Java是少数的集中支持多线程的语言之一,大多数的语言智能运行单独的一个程序块,无法同时运行不同的多个程序块,Java的多线程机制弥补了这个缺憾,它可以让不同的程序块一起运行,这样可以让程序运行更加顺 ...
- Java中CAS原理详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- jQuery中getJSON跨域原理详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- php中关于引用(&)详解
php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...
- Zigbee组网原理详解
Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57 [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...
随机推荐
- 10409 - Die Game
Problem G: Die Game Life is not easy. Sometimes it is beyond your control. Now, as contestants of AC ...
- 用WebCollector爬取站点的图片
用WebCollector爬取整站图片,仅仅须要遍历整站页面.然后将URL为.jpg.gif的页面(文件)保存到本地就可以. 比如我们爬取一个美食站点,获取里面全部的图片: import cn.edu ...
- 图像处理界的标准图像Lena背后的故事
今天晚上实验室的哥们问到我:“蒋志强,你知道咱们数字图像处理界标准图像Lena吗?” “当然知道啊,不就是那个512×512的美丽姐姐的标准图像么?”我不以为然的回答: “那幅图像事实上不是原始图像? ...
- 大型网站都喜欢把js写在html中的真正原因
相信经常观察大站的朋友都会发现,他们都把CSS写在HTML页面里,一个页面的或者多个页面的背景图片,都集成到一张图片里,他们有的JS文件,也写到页面里了……也许你会迷惑,现在到处讲页面的优化,不都是要 ...
- 在 Android 的 IM 应用中使用 asmack 库实现用户头像的传输(基于VCard协议)
http://quietmadman.blog.51cto.com/3269500/1359495 Beem http://beem-project.com/projects/beem/reposit ...
- java23 XML
XML:可扩展标记语言. xml可以当成一个小型的数据库, html / \ html5 xhtml(格式比较严格) | xml xml解析方式有2种: -SAX,SAX是基于事件流的解析,事件流解析 ...
- Android开发之Bitmap二次采样
Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题. 1.为什么要二次采样 OK,那么首先我要 解决的一个问题就是为什么我们要二次采样? 不知 ...
- JAVA_基础面试题
1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
- [置顶] gridview中嵌套gridview(并实现子gridview的数据绑定),页面传值,加密,数据绑定
先来张效果图 gridview 中嵌套gridview的原理是这样的,在父gridview中建一个摸板列,然后再模版列当中在放入子gridview,然后再父gridview的OnRowDataBoun ...
- Centos如何设置静态IP地址,LINUX怎么修改IP地址
1.登陆连接centos系统,输入 ifconfig 可以查看到当前本机的IP地址信息 2.临时设置IP地址: 输入 ifconfig eth0 (默认是第一个网卡) 后面接IP地址, 网络掩码和 网 ...