MapReduce 并行编程理论基础
对于mapreduce这一并行计算模型,一直以来都不是很清楚其具体的执行细节,今天看了学院一位老师的实验指导书,对这一过程有了一个初步的理解,特别是map阶段和reduce阶段,所以做了一份笔记,现在上传留存;
1 MapReduce 处理过程
在 Hadoop 中,每个 MapReduce 任务都被初始化为一个 Job,每个 Job 又可以分为两种 阶段:map 阶段和 reduce 阶段。从下图中可以看出,MapReduce 计算模型的核心部分是 map 函数和 reduce 函数。这两个函数的具体功能有用户根据需要自己设计实现。

在 Map 阶段,MapReduce 框架将任务的输入数据分割成固定大小的片段(splits)(那么谁来分,分割的依据又是什么?这里还需要去了解),随后 将每个 split 进一步分解成一批键值对<K1, V1>。Hadoop 为每一个 split 创建一个 Map 任务 (以下简称 Mapper)用于执行用户自定义的 map 函数,(这说明将数据切割成片的并不是map函数,同时mapper调用map函数)并将对应 split 中的<K1, V1>对作为 输入,得到计算的中间结果<K2, V2>。接着将中间结果按照 K2 进行排序,并将 key 值相同 的 value 放在一起形成一个新列表,形成<K2, list(V2)>元组。最后再根据 key 值的范围将这 些元组进行分组,对应不同的 Rreduce 任务(以下简称 Reducer)。
在 Reduce 阶段,Reducer 把从不同 Mapper 接收来的数据整合在一起并进行排序,然后 调用用户自定义的 reduce 函数,对输入的<K2, list(V2)>对进行相应的处理,得到键值对<K3, V3>并输出到 HDFS 上。既然 MapReduce 框架为每个 split 创建一个 Mapper,那么谁来确定 Reducers 的数目呢?答案是用户。mapred-site.xml 配置文件中有一个表示 Reducers 数目的属 性 mapred.reduce.tasks,该属性的默认值为 1,开发人员可以通过 job.setNumReduceTasks()方 法重新设置该值
2任务调度与执行
MapReduce 任务由一个 JobTracker 和多个 TaskTracker 两类节点控制完成。JobTracker 主要负责调度和管理 TaskTracker,它通常情况下运行在 Master 节点上。JobTracker 将 Mappers 和 Reducers 分配给空闲的 TaskTracker 后(这说明map函数和reduce函数都是运行在slaves节点上的),由 TaskTracker 负责这些任务的并行执行。 TaskTracker 必须运行在 DataNode 上,所以 DataNode 既是数据的存储节点,也是计算节点——这就是本地计算的概念,不依赖于网络宽带(我想这样可以减少因为数据传输而导致的延时)。 JobTracker 也负责监控任务的运行状况,如果某个 TaskTracker 发生故障,JobTracker 就会将 其负责的任务分配给其他空闲的 TaskTracker 重新执行。MapReduce 框架的这种设计很适合 于集群上任务的调度和执行,当然 JobTracker 的故障将引起整个任务失败,在 Hadoop 以后 的发行版本中或许会通过运行多个 JobTracker 解决这个问题。
备注:Hadoop MapReduce采用Master/Slave结构。
=====================================================================
*Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。
*Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。
二 JobTracker剖析:
(1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。
(2)JobTracker的主要功能:
1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
*最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
2.资源管理。
三 TaskTracker剖析:
(1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
(2)TaskTracker的功能:
1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
*机器级别信息:节点健康情况、资源使用情况等。
*任务级别信息:任务执行进度、任务运行状态等。
2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。
=====================================================================
3 Shuffle 过程
MapReduce 会将 Mapper 的输出结果按照 key 值分成 R 份(R 是预先定义的 Reducers 的 个数),划分时常使用哈希函数,如 Hash(key) mod R。这样可以保证某一范围内的 key 一定 由某个 Reducer 来处理,从而简化 Reduce 的过程。
4 合并 Mapper 输出
正如之前所说,带宽资源非常宝贵,所以 MapReduce 允许在 Shuffle 之前先对结果进行 合并(Combine 过程),即将中间结果中有相同 key 值的多组<key, value>对合并成一对。 Combine 过程和 Reduce 过程类似,很多情况下可以直接使用 reduce 函数,但 Combine 过程 是 Mapper 的一部分,在 map 函数之后执行。Combine 过程通常情况下可以有效地减少中间 结果的数量,从而减少数据传输过程中的网络流量。值得注意的是,Hadoop 并不保证其会 对一个 Mapper 输出执行多少次 Combine 过程,也就是说,开发人员必须保证不论 Combine 过程执行多少次,得到的结果都是一样的。
5 读取中间结果
在完成 Combine 和 Shuffle 的过程后,Mapper 的输出结果被直接写到本地磁盘(该节点就是一个tasktracker上,刚执行了map函数的节点)。然后, 通知 JobTracker 中间结果文件的位置,再由 JobTracker 告知 Reducer 到哪个 DataNode 上去 取中间结果。注意所有的 Mapper 产生的中间结果均按其 key 值用同一个哈希函数划分成 R 份,R 个 Reducer 各自负责一段 key 值区间。每个 Reducer 需要向多个 Mapper 节点取得落 在其负责的 key 值区间内的中间结果,然后执行 reduce 函数,形成一个最终的结果文件。
需要说明的是,Mapper 的输出结果被直接写到本地磁盘而非 HDFS,因为 Mapper 输出 的是中间数据,当任务完成之后就可以直接删除了,如果存储在 HDFS 上,HDFS 的备份机 制会造成性能的损失。
MapReduce 并行编程理论基础的更多相关文章
- MapReduce并行编程模型和框架
传统的串行处理方式 有四组文本数据: "the weather is good", "today is good", "good weather is ...
- 大数据学习笔记3 - 并行编程模型MapReduce
分布式并行编程用于解决大规模数据的高效处理问题.分布式程序运行在大规模计算机集群上,集群中计算机并行执行大规模数据处理任务,从而获得海量计算能力. MapReduce是一种并行编程模型,用于大规模数据 ...
- .NET并行编程1 - 并行模式
设计模式——.net并行编程,清华大学出版的中译本. 相关资源地址主页面: http://parallelpatterns.codeplex.com/ 代码下载: http://parallelpat ...
- C#并行编程-PLINQ:声明式数据并行
目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 通过LINQ可 ...
- 6.跑步者--并行编程框架 ForkJoin
本文如果您已经了解一般并行编程知识.了解Java concurrent部分如ExecutorService等相关内容. 虽说是Java的ForkJoin并行框架.但不要太在意Java,当中的思想在其他 ...
- Linux多核并行编程关键技术
多核并行编程的背景 在摩尔定律失效之前,提升处理器性能通过主频提升.硬件超线程等技术就能满足应用需要.随着主频提升慢慢接近撞上光速这道墙,摩尔定律开始逐渐失效,多核集成为处理器性能提升的主流手段.现在 ...
- C#并行编程-PLINQ:声明式数据并行-转载
C#并行编程-PLINQ:声明式数据并行 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-P ...
- Python并行编程的几个要点
一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现 ...
- python并行编程
一.编程思想 并行编程的思想:分而治之,有两种模型 1.MapReduce:将任务划分为可并行的多个子任务,每个子任务完成后合并得到结果 例子:统计不同形状的个数. 先通过map进行映射到多个子任务, ...
随机推荐
- Swift 中关于”??”操作符
Swift 中关于”??”操作符 Swift 的语法在保证安全和健壮的基础上,又带有很多非常灵活的特性,比如 ?? 操作符就是其中一个.大家可能已经了解它,也可能有些同学不了解它,这里给大家整理了关于 ...
- 【PTA 天梯赛】L2-1 分而治之(结构体存边)
分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题就请你编写程序,判断每个方案的可行性 ...
- 使用Linux命名将代码上传到GitHub
GitHub代码上传教程 https://my.oschina.net/baishi/blog/520791 这篇文章讲得挺清楚的,但是在上传的时候出现了问题 ! [rejected] master ...
- checked="checked"无效,radio未选中问题排查
在使用attr给元素设置属性的时候,但是显示在页面就是未选中,而且是只使用一两次是ok的,但是连着多使用就不起作用了,百度了下,发现遇到这个问题的人还蛮多的, 有人说,发现在jQuery1.6版本之后 ...
- Java四舍五入时保留指定小数位数
方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); , BigDecimal.ROUND_HALF_UP).doubleValue(); ...
- Co. - Microsoft - Windows - 快捷键
[F1-F12]键 [Win]键 Windows键就是电脑键盘上是Windows图标的键,一般在Ctrl键和Alt键之间.搜索看整个键盘你会发现键盘上有两个Windows键,主要是左右手设计方便按各种 ...
- 浅谈linux系统中pdf文件的默认打开方式
atril.gimp和evince,三者均可以打开application/pdf格式文件.gimp为一款图像处理软件:atril为mate环境下常用的文档查看器:evince为gnome环境下常用的文 ...
- 【PHP项目】产品新增的多图上传
产品新增:多图上传 1:html的更改 在 type=file的input框中添加multiple="multiple" name属性中必须添加[] ,否则$_FILES只能接收最 ...
- Hadoop(20)-MapReduce框架原理-OutputFormat
1.outputFormat接口实现类 2.自定义outputFormat 步骤: 1). 定义一个类继承FileOutputFormat 2). 定义一个类继承RecordWrite,重写write ...
- Black And White (DFS 训练题)
G - Black And White ================================================================================ ...