时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的。如果有幸能有大牛路过,请指教如何能以效率较高的方式学习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机制的更多相关文章

  1. Hadoop阅读笔记(一)——强大的MapReduce

    前言:来园子已经有8个月了,当初入园凭着满腔热血和一脑门子冲动,给自己起了个响亮的旗号“大数据 小世界”,顿时有了种世界都是我的,世界都在我手中的赶脚.可是......时光飞逝,岁月如梭~~~随手一翻 ...

  2. Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

    前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...

  3. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  4. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  5. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  6. Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

    继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...

  7. <<Java并发编程的艺术>>-阅读笔记和思维导图

    最近在坚持每天阅读<>,不但做好笔记(MarkDown格式),还做好思维导图. 如果大家感兴趣,可以可以到码云上阅读笔记和到ProcessOn上阅读思维导图. 码云:https://git ...

  8. 《大数据互联网大规模数据挖掘与分布式处理》阅读笔记(四)-----WEB广告

    作者: 沈慧 目前,许多WEB应用通过广告而维持生计,从在线广告中获益最多的是搜索应用,“adwords”模型就是一种用于搜索查询和广告匹配的模型.这一章介绍了在线广告的相关问题.在线算法.Adwor ...

  9. Hadoop学习笔记四

    一.fsimage,edits和datanode的block在本地文件系统中位置的配置 fsimage:hdfs-site.xml中的dfs.namenode.name.dir  值例如file:// ...

随机推荐

  1. word-wrap&&word-break,奇偶行、列设置样式

    1.word-wrap和word-break区分. 来源场景:机械租赁mvc驾驶员信息查看: 当备注的文字多的时候,第一列的值成这模样: 解决方案:设置table 的td可自动换行.首先table设置 ...

  2. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  3. Oracle Profile 使用

    一.目的: Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如果把该prof ...

  4. java获取路径的方法

    package com.zjf; import java.io.File; public class GetPath { public static void getPath() { //方式一 Sy ...

  5. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  6. C#的函数柯里化

    前面说到了C#的泛型委托和闭包函数,在函数是程序设计里还有一个重要特征是柯里化... 柯里化就是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结 ...

  7. HTML目录生成工具

    目录 内容简介 工具代码 使用方法 工具改进 内容简介 园子里面很多博主都会为自己的博文创建目录,方便大家浏览.我很好奇大家是怎么做的,是不是有自动生成目录的工具可以推荐一下(我知道word可以,但是 ...

  8. 浏览器 的 session 如何保持?!

    http://qindingsky.blog.163.com/blog/static/3122336200832853116360/ 在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览 ...

  9. VS2015的一些资料

    http://blog.csdn.net/hk_5788/article/details/48466295 主要看一下js支持方面的,另外今天复习了promise,刚入职的时候看得有些问题,今晚抽时间 ...

  10. oracle 表类型变量的使用

    转载于:http://www.itxuexiwang.com/a/shujukujishu/oracle/2016/0216/89.html?1455872314 使用记录类型变量只能保存一行数据,这 ...