hadoop两大核心之一:MapReduce总结

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序

本质上是并行运行的,因此可以解决海量数据的计算问题.

MapReduce任务过程被分为两个处理阶段:map阶段和reduce阶段.每个阶段都以键

值对作为输入和输出.用户只需要实现map()和reduce()两个函数即可实现分布式计算.

执行步骤:

map任务处理:

1.读取输入文件内容,解析成键值对(key/value).对输入文件的每一行,解析成

键值对(key/value).每一个键值对调用一次map函数

2.写自己的逻辑,对输入的键值对(key/value)处理,转换成新的键值对

(key/value)输出.

3.对输出的键值对(key/value)进行分区.(partition)

4.对不同分区的数据,按照key进行排序,分组.相同的key/value放到

一个集合中.(shuffle)

5.分组后的数据进行规约.(combiner,可选择的)

reduce任务处理:

1.对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点.

2.对多个map任务的输出进行合并,排序.写reduce函数自己的逻辑,对输入的

key/value处理,转换成新的key/value输出.

3.把reduce的输出保存到文件中(写入到hdfs中).

MapReduce作业流程:

1.代码编写

2.作业配置(输入输出路径,reduce数量等等)

3.作业提交

3.1通过JobClient提交,与JobTracker通信得到一个jar的存储路径和JobId.

3.2检查输入输出的路径

3.3计算分片信息.

3.4将作于所需要的资源(jar,配置文件,计算所得的输入分片)赋值到以作业ID

命名的HDFS上

3.5告知JobTracker作业准备执行.

4.作业初始化

当JobTracker接收到提交过来的作业后,会把次调用放入一个内部队列中,

交由作业调度器进行调度,默认是(FIFO),并对其初始化.

初始化:创建一个表示正在运行作业的对象--分装任务和记录信息,以便

跟踪任务的状态和进程.

为了创建任务列表,作业调度器首先从共享文件系统中获取已经计算好的

输入分片信息.然后为每一个分片创建一个map任务,调度器创建相应数量

的要运行的reduce任务.此时,任务被指定ID.

5.任务分配

tasktracker运行一个简单的循环来定期发送"心跳"给JobTracker,

心跳告知JobTracker,tasktracker是否还存活,同时指明tasktracker是否

已经准备好运行新的任务,如果是,JobTracker会分配给它一个任务.

6.任务执行

tasktracker拿到任务后

1.会将所有的信息拷贝到本地(包括jar,代码,配置信息,分片信息等)

2.tasktracker为任务新建一个本地工作目录,并把jar文件中的内容解压到

这个目录下.

3.tasktracker新建一个TaskRunner实例来运行该任务.

TaskRunner会启动一个新的JVM来运行每个步骤.(防止其他软件影响

到tasktracker,但是在不同的任务之间重用JVM是有可能的.

7.进度和状态的更新

task会定期向tasktracker汇报执行情况,tasktracker会定期收集所在

集群上的所有task信息,并想JobTracker汇报.JobTracker会根据所有

tasktracker汇报上来的信息进行汇总

8.作业完成

JobTracker是在接收到最后一个任务完成后,才将任务标记为"成功".

并将数据结果写入到HDFS上.

PS:

JobTracker职能:负责接收用户提交的作业,负责启动,跟踪任务执行

tasktracker职能:负责执行任务

作业失败:

1.JobTracker失败

这是最为严重的一种任务失败,失败机制--它是一个单节点故障,因此,

作业注定失败.(hadoop2.0解决了)

2.tasktracker失败

tasktracker崩溃了会停止向jobt发送心跳信息,并且JobTracker会将

tasktracker从等待的任务池中移除,将该任务转移到其他的地方执行.

JobTracker会将tasktracker加入到黑名单.

3.task失败

map或reduce运行失败,会向tasktracker抛出异常,任务挂起.

MapReduce启动流程:

start-mapred.sh  --> hadoop-daemon.sh --> hadoop

-->org.apache.hadoop.mapred.JobTracker

Jobtracker调用顺序:

main --> startTracker  --> new JobTracker 在其构造方法中首先创建

一个调度器,接着创建一个RPC的server(interTrackerServer)

tasktracker会通过PRC接触与其通信, 然后调用offerService方法对外

提供服务,在offerService方法中启动RPC server,初始化jobtracker,

调用taskScheduler的start方法 --> eagerTaskInitializationListener

调用start方法,接着调用jobInitManagerThread的start方法,

因为其是一个线程,会调用JobInitManager的run方法,随后

jobInitQueue任务队列去取第一个任务,然后把它丢入线程池中,

再调用-->InitJob的run方法,再然后调用jobTracker的initJob方法

--> JobInProgress的initTasks

--> maps = new TaskInProgress[numMapTasks]和

reduces = new TaskInProgress[numReduceTasks];

TaskTracker调用顺序:

main --> new TaskTracker在其构造方法中调用了initialize方法,

在initialize方法中调用RPC.waitForProxy,得到一个jobtracker的

代理对象,接着TaskTracker调用了本身的run方法,

--> offerService方法  --> transmitHeartBeat返回值是

(HeartbeatResponse)是jobTracker的指令,在transmitHeartBeat

方法中InterTrackerProtocol调用了heartbeat将tasktracker的状态

通过RPC机制发送给jobTracker,返回值就是JobTracker的指

令,heartbeatResponse.getActions()得到具体的指令,然后判断指令

的具体类型,开始执行任务,addToTaskQueue启动类型的指令

加入到队列当中,TaskLauncher又把任务加入到任务队列当中,

-->  TaskLauncher的run方法 --> startNewTask方法

--> localizeJob下载资源 --> launchTaskForJob开始加载任务

--> launchTask  --> runner.start()启动线程; -->

TaskRunner调用run方法 --> launchJvmAndWait启动java child进程

MapReduce的细节

序列化概念

序列化:是指把结构化对象转化为字节流.

反序列化:是序列化的逆过程.即:把字节流转回结构化对象.

hadoop序列化格式特点:

1.紧凑:高效使用存储空间

2.快速:读写数据的额外开销小

3.可扩展:可透明的读取老格式的数据

4.互操作:支持多语言交互.

hadoop序列化的作用:

序列化在分布式环境的两大作用:进程间的通信,永久存储.

hadoop节点间通信.

Partitioner编程

将有一些共同特性的数据,写入到同一个文件里.

排序和分组

在map和reduce阶段进行排序时,比较的是k2。v2是不参与排序比较的。

如果要想让v2也进行排序,需要把k2和v2组装成新的类,作为k2,

才能参与比较。如果想自定义排序规则,被排序的对象要实现

WritableComparable接口,在compareTo方法中实现排序规则,

然后将这个对象当做k2,即可完成排序分组时也是按照k2进行比较的。

Combiners编程

1.每一个map会产生大量的输出,combiner的作用就是在map端对输出

先做一次合并,以减少传输到reducer的数据量.

2.combiner最基本是实现本地key的归并,具有类似本地reduce功能

如果不用combiner,那么所有的结果都是reduce完成,效率会相对降低,

3.使用combiner,先完成的map会在本地聚合,提升速度.

PS:Combiner的输出是Reducer的输入,Combiner绝对不能改变最终的计算结果.

所以从个人角度来说,Combiner只应用于那种Reducer的输入key/value与

输出key/value类型完全一致,且不影响最终结果的场景.比如:累加,最值等.

shuffle

MapReduce确保每个Reducer的输入都按键排序,系统执行排序的过程

---将map输出作为输入传给Reducer---成为shuffle(洗牌)

1.map函数开始产生输出时,并不是简单的将它写到磁盘.它利用缓冲的

方式写到内存,并出于效率的考虑进行了预排序.

每个map任务都有一个环形内存缓冲区,用于存储任务的输出.默认情况下,

缓冲区大小为100MB,一旦缓冲内容达到阀值(默认为80%),一个后台线程

便开始把内容写到磁盘指定目录下新建一个溢写文件中.在写到磁盘过程中,

map输出继续被写到缓冲区,但如果在此期间缓冲区被填满, map会阻塞,

直到写磁盘过程完成.

2.写磁盘前,要partition,sort。如果有combiner,combine排序后数据。

3.等最后记录写完,合并全部溢写文件为一个分区且排序的文件。

Reducer如何知道要从哪个tasktracker取得map输出呢?

map任务成功完成后,它们会通知其父tasktracker状态已更新,然后tasktracker

进而通知JobTracker.这些通知在心跳机制中传输.因此,对于指定作业,

JobTracker知道map输出和tasktracker之间的映射关系. Reducer中的一个

线程定期询问JobTracker以便获取map输出的位置,直到它获得所有输出位置.

http://m.oschina.net/blog/213034

时间: 2024-10-05 23:47:39

hadoop两大核心之一:MapReduce总结的相关文章

Java入门到精通——框架篇之Spring源码分析Spring两大核心类

一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.springframework.beans.factory.support包下. XmlBeanFactory(位于org.springframework.beans.factory.xml包)继承自DefaultListableBeanFactory,而DefaultListableBeanFactory

Spring 两大核心IOC和DI

Spring的两大核心是IOC和DI IOC:控制反转,对象创建的权利交给springApplication容器 DI:依赖注入,注入的是属性 传统意义上创建对象都是new操作. 举个例子: dao层类:UserDao service层类:UserService web(controller)层:UserController 三个层的调用关系为: web --->  service  --->   dao 这样的情况 web层会new一个service层对象 service层会new一个dao

Spring 两大核心 IOC 和 AOP

如果你的简历上写着Spring (请详述一下spring的两大核心)这个问题一定会被问到. 一.什么叫IOC 1. IOC 全称(Inversion of Control)-- 控制反转. IOC 只是一种设计思想,具体实现是 DI (Dependency Injection)-- 依赖注入 ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建:谁控制谁?当然

抖音运营为您分析抖音企业的两大核心价值

疫情带来挑战也带来机遇可以预见的是,运算能力会是企业未来的根本能力,像一些短视频.外卖平台就是抓住了这个能力,在疫情来临时,才不会手忙脚乱,反而流量再创新高,并从传统企业手中批量夺走客户.宅经的济兴起,电商.短视频.科技.人工智能等领域会飞速增长.顺应时代潮流,是每个企业都必须做的事情, 学会运营抖音将就是第一步.现在抖音运营抖商快车为您分析抖音企业的两大核心价值.建立品牌在短视频平台上的用户资产:一般来讲,很多品牌在进行短视频营销时,只是一次性投放,视频传播过后只能留下曝光数据.而有了企业号这

hadoop的两大核心之一:HDFS总结

什么是HDFS? hadoop distributed file system(hadoop分布式文件系统) 是一种允许文件通过网络在多台主机上分享的文件系统, 可让多机器上的多用户分享文件和存储空间. 特点: 1.通透性.让实际上是通过网络来访问文件的动作,由程序与用户看来, 就像是访问本地的磁盘一般. 2.容错性.即使系统中有某些节点脱机,整体来说系统仍然可以持续运作 而不会有数据损失. 适用场景: 适用于一次写入多次查询的情况,不支持并发写情况,小文件不合适. HDFS的架构 主从结构 主

Spring系列之——Spring事务以及两大核心IOC和AOP

1 Spring事务 1.1 Spring事务是什么(百度) 事务是对一系列的数据库操作(比如插入多条数据)进行统一的提交或是回滚操作,如果插入成功,那么一起成功,如果中间一条出现异常,那么回滚之前的所有操作. Spring事务管理机制使用的是TransactionManager进行管理.回滚注解@Transactional. 2 Spring特征 1)开源框架. 2)IOC(控制反转) 将类的创建和依赖关系写在配置文件中,由配置文件注入,实现松耦合. 3)AOP 将安全.事务等程序逻辑相对独立

【hadoop之翊】——hadoop大核心之HDFS初识

今天来说说hadoop的一大核心--HDFS,这个是很重要的,它呢,是分布式文件系统.为什么说hadoop能存储海量数据?其实主要还是依赖与hdfs的能力,主要依赖的是hdfs能存储海量数据. 1. 为什么hdfs能存储海量数据呢? 一开始抛出这样的问题来想想.至于HDFS的基本概念什么的都不用多说了的~我们重在使用,而不是去做"研究".扯蛋的话就是,"专家的研究"已经成为名副其实的贬义词了,很带有讽刺意义了,在现在这个时代~你们懂的~因为他们有的没有真正经历过,而

深入理解Spring的两大特征(IOC和AOP)<转>

在某博主的博客上看到一篇解释Spring的两大核心IOC与AOP的文章,借此转发一下,希望能够帮助到更多的人. 原文地址:https://blog.csdn.net/gloomy_114/article/details/68946881 众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即"控制反转":AOP(Aspect-OrientedProgramming),即"面向切面编程". IOC:IOC,另外一种说

Hadoop 的核心:Mapreduce思想说明

Mapreduce思想 1. 就是做一个计算,如果计算过程中如果数据传输消耗的资源大于计算消耗的资源,考虑在计算过程中,将算法(程序),移动到数据存放的服务器中,再进行计算. 2. 在做一个巨型计算时,利用多台(例如 2000 )台服务器的 cpu 和内存同时计算. 算法描述 第一种方式描述 将计算要用的数据切分,放在各个服务器上,然后将计算程序分发到各个服务器,计算出各个部分的结果.最后将各个计算结果合并. 第二种方式描述 另外一种描述为, MapReduce 的名字源于这个模型中的两项核心操