Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的。如果有幸能有大牛路过,请指教如何能以效率较高的方式学习Hadoop。
我已经记不清圣经《hadoop 实战2》在我手中停留了多久,但是每一页每一章的翻过去,还是在脑壳里留下了点什么。
一段时间以来,我还是通过这本书加深以及纠正了我对于MapReduce、HDFS乃至Hadoop的新的认识。本篇主要介绍MapReduce作业的工作机制,并介绍介于Map和Reduce过程中的Shuffle和排序过程。
为响应标题,我们今天谈的MapReduce机制,切入点是一张图。先上图:
从图中不难看出,整个MapReduce分为以下流程:代码编写->作业配置->作业提交->Map任务的分配和执行->处理中间结果->Reduce任务的分配和执行->作业完成
图中:
1.运行作业
2.获取作业ID
3.复制作业资源
4.提交作业
5.初始化作业
6.获取输入分割
7.心跳通信
8.获取作业资源
9.发布
10.运行
以上过程主要涉及到的实体有客户端(用于MR代码的编写,配置作业,提交作业);TaskTracker(保持与JobTracker通信,在分配的数据片段上执行Map或Reduce任务);HDFS(保存作业的数据、配置信息、作业结果等);JobTracker(初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行)
提交作业
在提交作业前,我们需要对作业进行配置,主要包括:
(1)程序代码
(2)Map和Reduce接口
(3)输入输出路径
(4)其他配置,如InputFormat、OutputFormat等
提交作业的过程可以分为以下几步:
(1)调用JobTracker对象的getNewJobId()方法从JobTracker处获取当前作业的ID(见途中步骤2)
(2)检查作业相关路径,在运行代码时,经常遇到报错提示输出目录已存在,所以在运行代码前要确保输出目录不存在
(3)计算作业的输入划分
(4)将运行所需资源(如jar文件、配置文件、计算所得输入划分等)复制到作业对于的HDFS上(见步骤3)
(5)调用JobTracker对象的submitJob()方法来真正提交作业,通知JobTracker作业准备执行(见步骤4)
初始化作业
JobTracker在客户端调用其submitJob()方法后,会将此调用放入内部的TaskScheduler变量中,进行调度,默认调度方法为:JobQueueTaskScheduler即FIFO调度方式。
初始化作业分为如下几个步骤:
(1)从HDFS中读取作业对应的job.split(见步骤6),JobTracker从HDFS中作业对应的路径获取JobClient在步骤3中写入的job.split文件,得到输入数据的划分信息,为后面初始化过程中Map任务的分配做好准备。
(2)创建并初始化Map任务和Reduce任务。
(3)创建两个初始化Task,根据个数和输入划分已经配置的信息,并分别初始化Map和Reduce。
分配任务:
TaskTracker和JobTracker之间的通信和任务分配都是通过心跳机制完成的。TaskTracker会以一定间隔时间向JobTracker发送心跳,告诉自己是否存活,准备执行新任务;而JobTracker在接收到心跳信息后会查看是否有待分配任务,如果有,则会分配给TaskTracker。
执行任务:
当TaskTracker接收到新任务时就要开始运行任务,第一步就是将任务本地化,将任务所需的数据、配置信息、程序代码从HDFS复制到TaskTracker本地(将步骤8)。该过程主要通过localizeJob()方法来实现任务的本地化,具体包括以下几个步骤:
(1)将job.split复制到本地
(2)将job.jar复制到本地
(3)将job的配置信息写入job.xml
(4)创建本地任务目录,解压job.jar
(5)调用launchTaskForJob()方法发布任务(见步骤9)
更新任务执行进度和状态:
由MapReduce作业分割成的每个任务中都有一组计数器,他们对任务执行过程中的进度组成事件进行计数。如果任务要报告进度,它便会设置一个标志以表明状态变化将会发送到TaskTracker上,另一个监听线程检查到这标志后,会告知TaskTracker当前的任务状态。
完成作业:
所有TaskTracker任务的执行进度信息都汇总到JobTracker处,当JobTracker接收到最后一个任务的已完成通知后,便把作业的状态设置为“成功”。
Shuffle和排序:
在Map和Reduce之间有一个叫做Shuffle的过程,主要的工作是将Map的输出结果进行一定的排序和分割再交给Reduce,从某种程度上说,Shuffle过程的性能与整个MapReduce的性能直接相关。
Shuffle过程分为Map和Reduce端。Map端的Shuffle过程是对Map的结果进行划分(partition)、排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起(merge)并写在磁盘上,同时按照不同的划分将结果发送给对应的Reduce(Map输出的划分与Reduce的对应关系由JobTracker确定)。
Reduce端又会将各个Map送来的属于同一个划分的输出进行合并(merge),然后对merge的结果进行排序,最后交给Reduce处理。
对于Hadoop等大数据技术有兴趣的欢迎加群413471695交流讨论^_^
本文链接:《Hadoop阅读笔记(四)——一幅图看透MapReduce机制》
友情赞助
如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。
1. 支付宝 2. 微信
Hadoop阅读笔记(四)——一幅图看透MapReduce机制的更多相关文章
- Hadoop阅读笔记(一)——强大的MapReduce
前言:来园子已经有8个月了,当初入园凭着满腔热血和一脑门子冲动,给自己起了个响亮的旗号“大数据 小世界”,顿时有了种世界都是我的,世界都在我手中的赶脚.可是......时光飞逝,岁月如梭~~~随手一翻 ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
- Hadoop阅读笔记(五)——重返Hadoop目录结构
常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...
- Hadoop阅读笔记(七)——代理模式
关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...
- Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...
- <<Java并发编程的艺术>>-阅读笔记和思维导图
最近在坚持每天阅读<>,不但做好笔记(MarkDown格式),还做好思维导图. 如果大家感兴趣,可以可以到码云上阅读笔记和到ProcessOn上阅读思维导图. 码云:https://git ...
- 《大数据互联网大规模数据挖掘与分布式处理》阅读笔记(四)-----WEB广告
作者: 沈慧 目前,许多WEB应用通过广告而维持生计,从在线广告中获益最多的是搜索应用,“adwords”模型就是一种用于搜索查询和广告匹配的模型.这一章介绍了在线广告的相关问题.在线算法.Adwor ...
- Hadoop学习笔记四
一.fsimage,edits和datanode的block在本地文件系统中位置的配置 fsimage:hdfs-site.xml中的dfs.namenode.name.dir 值例如file:// ...
随机推荐
- C++ - 复制(copy) 和 虚复制(virtual copy) 的 区别
复制(copy) 和 虚复制(virtual copy) 的 区别 本文地址: http://blog.csdn.net/caroline_wendy/article/details/16120397 ...
- opencl初体验
总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...
- 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)
解剖SQLSERVER 第二篇 对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...
- App开发如何利用Fidder,在api接口还没有实现的情况下模拟数据,继续开发
相信app开发很多时候,都是等后台出接口,拿到数据调试错误.殊不知,我们完全可以不用等,只要有约定好的接口定义文档,借助工具就能做到,自己模拟数据返回~ 下面主要是在项目组开发过程中,使用F ...
- DataTable汇总
一.排序 1 获取DataTable的默认视图 2 对视图设置排序表达式 3 用排序后的视图导出的新DataTable替换就DataTable (Asc升序可省略,多列排序用"," ...
- CentOs 7怎么联网
在安装好Centos7后,网络还不能正常使用,需要我们手动配置.并且Linux的网络配置并不太容易,新手经常不知道从何开始.为了解决这个令大家头疼的问题,我在此将成功的配置过程与大家分享.希望大家都能 ...
- Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)
一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit 下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...
- 代码规范、代码复审、PSP
作业三: 代码规范.代码复审.PSP 代码规范 代码规范的重要性 一.规范的代码可以促进团队合作 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异.且不说会存 ...
- angular中的MVVM模式
在开始介绍angular原理之前,我们有必要先了解下mvvm模式在angular中运用.虽然在angular社区一直将angular统称为前端MVC框架,同时angular团队也称它为MVW(What ...
- Handlebars.js循环中索引(@index)使用技巧(访问父级索引)
使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...