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进行映射到多个子任务, ...
随机推荐
- linux 怎么查看系统的环境变量 与设置jdk 系统环境变量
1.win 7 ,win10 怎么查看,添加系统环境的变量,大家都非常清楚的.但是linux 的 却不一定哦. 打开终端输入 : “echo $PATH “ or “export ” 如 ...
- Python基础—15-正则表达式
正则表达式 应用场景 特定规律字符串的查找替换切割等 邮箱格式.URL.IP等的校验 爬虫项目中,特定内容的提取 使用原则 只要是能够使用字符串函数解决的问题,就不要使用正则 正则的效率较低,还会降低 ...
- iOS 崩溃日志分析(个人总结,最实用)
iOS 崩溃日志分析(个人总结,最实用) 要分析奔溃日志需要三个文件:crash日志,symbolicatecrash分析工具,.dSYM符号集 0. 在桌面创建一个crash文件夹 1. 需要Xco ...
- WebGL学习笔记(2)
根据上一篇学习笔记,理解WebGL的工作原理及基本调用代码后,可以开始研究3D顶点对象的缩放.旋转.以及对对象进行可交互(鼠标或键盘控制)的旋转或者缩放. 要理解对象的旋转/缩放需要首先学习矩阵的计算 ...
- 小B的询问(莫队)
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
- Windows之cmd指令
gpedit.msc-----本地计算机策略sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff------- ...
- Java : java基础(3) IO流
流按操作类型分为两种,字节流,字符流,按流向分为输入流,输出流,输入流的抽象父类InputStream,输出流抽象父类OutputStream,字符流的抽象父类是Reader和Writer 一般用字节 ...
- Python学习 :格式化输出
方式一:使用占位符 % 常用占位符:% s (s = string 字符串) % d (d = digit 整数(十进制)) % f ( f = float 浮点数) na ...
- ALVのイベントを取得する方法
概要 表示されたALVをダブルクリックした時に別画面へ遷移する方法を説明しよう.下記サンプルのように標準トランザクションへ遷移したり.別のALVを表示したりする事が可能である. サンプルコード ABA ...
- x86的控制寄存器CR0,CR1,CR2,CR3
状态和控制寄存器组除了EFLAGS.EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3. 这几个寄存器中保存全局性和任务无关的机器状态. CR0中包含了6个预定义标志,0位是保 ...