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进行映射到多个子任务, ...
随机推荐
- sprinbboot 热部署 造成类加载器 不一致问题
这里只说devtools的方式,注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9), 自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟 ...
- iOS之已经审核通过的app在App Store上搜不到的解决办法
修改定价将你的app定价修改成0.99刀 修改你的发行范围,全取消后只选中国. save这时候你的app status将会变成pending contract. 将之前的修改都改回来,修改定价free ...
- 手机浏览器页面点击不跳转(Android手机部分浏览器) 浏览器双击放大网页 解决
手机端web网页项目(angluar js 1.4.6) 1,网页项目开发过程中,使用PC浏览器能正常访问,IOS设备浏览器也能正常访问,但是使用Android部分浏览器进行访问的时候,链接偶尔不跳转 ...
- 车站分级 (2013noip普及组T4)(树形DP)
题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n 的 n个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x ...
- [SDOI2008]仪仗队(欧拉筛裸题)
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如右图 ...
- PHP+Mysql注入防护与绕过
今天给大家分享一个关于php常见的注入防护以及如何bypass的文章,文章内容来源国外某大佬总结,我做了一下整理,文章来源地址不详,下面正文开始.以下的方式也仅仅是针对黑名单的过滤有一定的效果,为了安 ...
- 三角形div原理(小知识点)
三角形div其实就是从边框的演变过程 #sider2{ width: 100px; height: 100px; border-top: 30px solid #000; border-right: ...
- docker API 配置与使用
在网上看到一大堆乱乱七八招的博客,很多都不能用,我根据这些天踩的坑来总结一下吧 首先!怎么配置 docker API 两种方法 在/etc/sysconfig/docker文件里加一行OPTIONS= ...
- less学习二---变量
less中声明的变量可以存储css属性值,还可以存储选择器,属性名,url以及@imporant等 变量声明及赋值格式:@variableName : varableValue ; //属性值 //l ...
- C#正则表达式Regex类的使用
C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间所在DLL基本上在所有的项目模板中 ...