MapReduce Simplified Data Processing on Large Clusters 论文笔记

news2024/11/24 19:28:51

2003年USENIX,出自谷歌,开启分布式大数据时代的三篇论文之一,作者是 Jeffrey 和 Sanjay,两位谷歌巨头。

Abstract

MapReduce 是一种变成模型,用于处理和生成大规模数据。用户指定 map 函数处理每一个 key/value 对来产生中间结果的 key/value 对;reduce 函数合并每一个相同中间 key 的 value。

这种编程风格能自动获得并行在大型集群上运行的便利。这套运行时系统则帮助用户接管来数据分片分发,机器通讯,节点失败等问题。无需用户了解并行分布式系统的知识就能利用好大型分布式系统。

1 Introduction

以往做大型分布式处理的时候,大家都是简单直白的方式开发实现。这往往要处理很多分布式的情况,比如数据划分,传输,失败节点处理等。这一大堆事情要求的技术复杂,而且反而淹没了最初的业务目的。

为了应对上述情况,开发了这套系统。受到 map reduce 这种函数式编程原语的启发。把大部分操作拆分成 map 阶段和 reduce 阶段,并且可以用户自定义的实现 map 函数和 reduce 函数,这样可以进行大规模并行计算,也能够用重新执行作为失败处理。

作者给出了这套系统的接口以及实现的细节。

2 Programming Model

整体计算的输入是一堆 key/value 对,产生的输出也是 key/value 对,用户使用 MapReduce 要实现两个函数:Map 和 Reduce。

Map 函数由用户开发,输入 kv 对,产生中间 kv 对。MapReduce 系统把中间 kv 对里有相同中间 key I 的 value 聚集到一起,然后传给 Reduce 函数。

Reduce 函数也有用户开发,接受 key I 和 这个 key 的 value 集合。Reduce 操作合并相同 key 下的所有 value,产生更少的 value。中间 value 是通过迭代器的方式支撑 Reduce 函数,因此能借助磁盘,处理超过内存大小的数据量。

2.1 Example

作者举例了一个单词统计的伪代码:

map(String key, String value):
	// key: document name
	// value: document contents
	for each word w in value:
		EmitIntermediate(w, "1");

reduce(String key, Iterator values):
	// key: a word
	// values: a list of counts
	int result = 0;
	for each v in values:
		result += ParseInt(v);
		Emit(AsString(result));

用户写代码填充 MapReduce 的特定对象,比如特定的参数和自定义参数,然后调用 MapReduce,把这两个对象出给系统,就结束了。

2.2 Types

2.3 More Example

Distributed Grep(分布式正则):

map 函数对满足条件的数据行发射出去,作为输出,reduce 是个恒等函数,直接复制输入到输出

Count of URL Access Frequency:

map 函数处理处理访问日志,输出<url, 1>,reduce 函数把 url 相同的加起来,输出 <url, total count>

3 Implementation

对于定义的接口有很多不同的实现,但具体怎么实现要依赖运行服务的环境,是小内存机器、多核机器、大型网络机器等。作者给出了Google环境的设计目标:大集群普通机器,以太网交换机相连。双核x86 CPU,2~4G内存的Linux服务器…100Mbit/s 或 1Gbit/s 的网卡…一个集群几百上千台吧,节点故障比较常见…每个机器都有独立的 IDE 磁盘,上面部署着 GFS…用户会提交作业给调度系统,每个作业里面又包含几个任务,调度系统会调度到可用机器上执行。

3.1 Execution Overview

Map 操作分布式的在多机上执行,执行前,输入数据会被划分成 M 的子集。Reduce 操作也可以根据中间数据 key 划分成多个子集分布式的处理。这里的划分函数可以被用户指定,例如 hash(key) mod R。在这里插入图片描述
MapReduce 流程:

  1. 先将数据分片,16~64M一份,然后把程序拷贝到集群
  2. 其中的一份程序是 master,其余是 worker。共有 M 个 map 任务和 R 个 reduce任务。master 给空闲的 worker 分配 Map 任务或者 Reduce 任务
  3. map 任务的读取分片的数据,处理之后缓存在内存中
  4. 内存中的数据被划分函数拆分成 R 个部分,然后写入本地磁盘。接着上报本地磁盘中的位置给 master,master 会把这些地址传递给 reduce workers
  5. reduce worker 收到 master 通知的数据地址,就通过RPC读取 map worker 机器上的数据,读完后排序,使得所有想通 key 的数据在一起。因为会有很多不同 key 的任务给同一个 reduce worker
  6. reduce worker 把想通 key 和对应的 value 传递给 Reduce 函数,函数的输出结果存放到输出文件中,这里是个全局文件系统
  7. 所有 map 操作和 reduce 操作都执行完,MapReduce 调用返回用户程序

MapReduce 执行的结果是若干个输出文件,一个 reduce task 一个输出。通常用户不需要拼接这些输出,而是作为下一个 MapReduce 操作的输入。

3.2 Master Data Structures

master 存储了一些数据结构,例如 map task 和 reduce task 的状态(空闲、处理中、处理完成)以及机器的情况。

master 还存储每个 map 任务完成后,输出的文件位置和大小。这些信息会推送给准备好的 reduce 任务。

3.3 Fault Tolerance

Worker Failure

master 周期性的 ping 一下 worker,如果一段时间内,没有收到响应,则标记为 worker 故障。任何在这台 worker 上面完成的 map 任务都标记为初始化状态,等待重新调度。任何在这台 worker 上面正在执行的 map 和 reduce 任务也都标记初始化状态,等待调度。完成了的 map 任务如果是在故障机器上,只能重新执行,因为存储在故障机器本地。执行完成的 reduce 任务如果在故障机器上则不需要重新执行,因为结果存放在全局文件系统中。

当 map 任务在A上执行,然后因为A故障而调度到B执行时,所有执行 reduce 任务的 worker 会被通知到,同时没有获取结果数据的 worker 会从 B获取相应的这部分数据。

此外,整个集群因为这种简单的重复执行机制,能从大规模的故障中恢复。只要重新能探活到,就有机器能执行,整个进程就会向前推进。

Master Failure

master 的数据很容易就写到 checkpoint 中,这意味着一旦 master 故障,副本可以从 checkpoint 中很快的恢复。不过作者认为只有一个 master,所以不太可能故障。如果故障了,整个计算过程就失败了,客户端可以选择重做。

Semantics in the Presenceof Failures

当用户提供的map和reduce运算符是其输入值的确定函数时,我们的分布式实现产生的输出与整个程序的非错误顺序执行产生的输出相同。

reduce 任务在输出时,先写到临时文件中,等一个任务完全结束的时候,立刻改名成最终文件名。这个操作是原子的。

因为绝大多数 map 和 reduce 操作都是确定性函数,并且等价于顺序执行,开发人员也很容易保证其行为。但是对于非确定性函数的 map 和 reduce,结果就比较难保证了。

3.4 Locality

网络带宽是相对稀缺的资源,所以输入数据读取的是提交任务机器本地磁盘上的文件。然后GFS会把这个文件分成64MB一个的块,备份存储到不同的机器上。master 有这些存储信息,调度的时候会优先调度到有数据分片的机器上执行任务。即使 work 失败了,也会调度到距离数据副本比较近位置的机器上,例如同一个机架或者交换机下的机器。要考虑网络带宽这种资源。

3.5 TaskGranularity

任务分片的粒度也是个值得考究的点。map 任务分成M个,reduce任务分成R个,通常来说,M和R的个数远大于机器数量,这样能执行得比较快,并发度高,且失败了容易恢复。但是大的M和R也有成本,就是 master 要存储 O(M×R) 个状态,以及做 O(M+R) 次调度计算。一般来说,R 的数量会被用户决定。一般来说,就是把输入数据划分成 16MB 或者 64MB 大小的文件分片决定 M 个数。R 总数就是机器数量的一个固定倍数。作者举例 2000台机器,5000个R任务,200000个M任务。

3.6 BackupTasks

一个 MapReduce 任务被其中几个分片的 map 任务或 reduce 任务整体拖慢的情况也有发生,这种称为 straggler。一般都是执行慢的机器有点问题,例如磁盘坏了,读取速度下降。或者调度了多个任务,使得计算资源不太足够,还有一类是程序 bug,遇到过 bug 使得缓存失效…

有策略缓解这类情况。对快要结束的任务,master 调度一个备份任务,不管是主任务执行完,还是备份任务执行完,都算整个任务执行完了。同时通过控制这个机制中的快要结束的认定,能让系统增加资源消耗不太多的情况下,极大缩短 straggler 的影响。

4 Refinements

4.1 Partitioning Function

用户自定义要切分成多少份的输出,可以自定义分片函数

4.2 Ordering Guarantees

系统保证,在一个输出的分片里面,键值对按照 key 的升序排列

4.3 Combiner Function

对于 map 操作中很多重复的键值对,可以在发往 reduce操作前通过 Combiner function 进行合并,粒度是每一个 map 任务。

4.4 Input and Output Types

MapReduce 系统支持一些定义好的输入输出格式,例如文件输入,一行一对 key value。此外,还支持用户自定义 reader,读取不同格式,比如数据库读取,内存映射等多种形式的数据。

4.5 Side-effects

没看懂

4.6 Skipping Bad Records

对于一些错误记录来说,可能会引起 MapReduce 系统崩溃,但这些错误记录来自难以修复的问题,例如使用第三方库…而且有时候错误记录对整体影响不大,例如大数据量统计和个位数的记录错误…所以 MapReduce 系统支持选项,探测坏记录以及是否跳过。

实现方式是,在所有的 worker 上有信号处理代码(signal handler)用来捕获段错误和错误信息。全局有一套错误错误码表。当用户代码触发错误的时候,信号处理器会发送包含错误码的信息 “last gasp" 给 master。当 master 看到某个特定记录上的错误超过1次时,会决定跳过此记录。

4.7 Local Execution

分布式的调试很困难,所以 MapReduce 有本地运行测试版,串行执行每一个任务,方便调试。

4.8 Status Information

master 内部有个 HTTP 服务,对外暴露状态信息页。top-level 页是一些统计信息,例如哪些任务成功,哪些失败。其他更细节的信息在更底层的页面,包含已完成的任务,进行中的任务,输入数据量,输出数据量,任务进行进度等。这些都是阅读友好的形式。

4.9 Counters

一个内置的工具函数,不过在实现的时候,会周期性的向 master 汇报当前计数,master 会做聚合,并展示在状态页上。

6 Experience

最后作者在这一章列举了一个使用 MapReduce 的例子,大规模索引

6.1 Large-ScaleIndexing

是 google 搜索引擎的索引,产生自爬虫服务,大约20T数据。用了 MapReduce 有几个好处:

  • 代码变简单,去掉了故障处理,分布式、并行处理,失败恢复等逻辑,被 MapReduce 隐藏了。代码量从3700行–> 700行
  • 性能好,使得可以独立开发建索引的每个阶段,而不必耦合。这样改动建索引的流程也方便
  • 操作性和扩展性强,故障被 MapReduce 屏蔽了,想提速加机器就行

8 Conclusions

作者认为 MapReduce 能成功,第一是简单好用,对于开发者来说,无需理解太多分布式,并行的概念也能很好的使用;第二是适用性广,绝大多数问题都可以归结为 map-reduce 这个范式;第三是有分布式的实现,在 google 内部真的用了起来。

作者还总结出:

  • 对编程范式做约束,使得分布式并行计算,故障忍耐都变得容易
  • 带宽是稀缺资源,用本地磁盘做替换是个不错的选择
  • 冗余的操作可以减少慢机器的影响,也可以用来处理机器故障和数据丢失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机上安装AI模型是一种什么体验?

昨天参加微软的AI DAY活动&#xff0c;看到微软的技术大佬分享了一个场景&#xff0c;就是坐飞机从上海到北京&#xff0c;机长广播因为天气原因&#xff0c;飞机需要盲降&#xff0c;他说当时听到盲降第一反应感觉有点恐慌&#xff0c;但是因为飞机上受限于网络环境&#xff0…

TIA博途中库类型和库元素的基本使用方法介绍

TIA博途中库类型和库元素的基本使用方法介绍 TIA博途中有两种不同类型的库: “项目库” “全局库” 内容由两种存储类型组成: • “类型” • “模板副本” (1) “项目库” – 集成在项目中,与项目一起管理 – 允许项目内可重复使用 (2) “全局库” – 独立库 – 可在…

MyBatis的逆向工程详细步骤操作

1. MyBatis的逆向工程详细步骤操作 文章目录 1. MyBatis的逆向工程详细步骤操作2. 逆向工程配置与生成2.1 MyBatis3Simple&#xff1a;基础版&#xff0c;只有基本的增删改查2.1.1 第一步&#xff1a;在pom.xml 中添加逆向工程插件2.1.2 第二步&#xff1a;配置 generatorConfi…

网络安全攻防基础入门笔记--操作系统名词解释文件下载反弹shell防火墙绕过

渗透测试常用专业术语 POC,EXP,Payload,Shellcode POC 全程Proof of Concept,中文"概念验证",常指一段漏洞证明的代码 EXP 全程Exploit ,中文"利用",指利用系统漏洞进行攻击的动作 Payload 中文"有效载荷",指成功Exploit之后,真正在目标系…

屹晶微EG3002 单通道功率MOSFET驱动芯片 贴片SOP8

EG3002作为一款功率MOSFET驱动芯片&#xff0c;它的应用领域主要取决于其技术参数和性能特点。根据之前提供的信息&#xff0c;EG3002可能适用于以下领域&#xff1a; 1. 电源管理&#xff1a;用于高效率电源转换器&#xff0c;如开关电源&#xff08;SMPS&#xff09;、电池充…

(虚拟机)VMware软件的安装及Ubuntu系统安装

一、VMware软件的安装 软件下载&#xff0c;可以自己找或者百度网盘下载&#xff1a; 通过百度网盘分享的文件&#xff1a;ubuntu16…等2个文件 链接:https://pan.baidu.com/s/1VEnZKY9DJ1T1vC3ae20gKQ 提取码:11b6 复制这段内容打开「百度网盘APP 即可获取」 1、解压VMwar…

进程的创建和管理

一. 实验内容 1&#xff0e; 编写一个程序&#xff0c;程序中创建一个子进程。然后父、子进程各自独立运行&#xff0c;父进程不断地在标准输出设备&#xff08;即显示器&#xff09;上输出字母p和回车&#xff08;输出30次或以上&#xff09;&#xff0c;子进程不断地在标准输…

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal&#xff08;最小可检测信号&#xff09;是指当信号-噪声比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;等于1时的输入信号水平。简单来说&#xff0c;MDS 是一个系统能够分辨出信号存在的最低输入信号…

官方文档 搬运 MAXMIND IP定位 mysql导入 简单使用

官方文档地址&#xff1a; 官方文档 文件下载 1. 导入mysql可能报错 Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 查看配置 SHOW GLOBAL VARIABLES LIKE %secure%;secure_file_priv 原来…

vite-plugin-mock前端自行模拟接口返回数据的插件

vite-plugin-mock前端自行模拟接口返回数据的插件 安装导入、配置&#xff08;vite.config.js&#xff09;使用目录结构/mock/user.js具体在页面请求中的使用 注意事项 中文文档&#xff1a;[https://gitcode.com/vbenjs/vite-plugin-mock/blob/main/README.zh_CN.md) 参考其他…

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BP-ABKDE的BP神经网络自适应带…

深入理解计算机系统 CSAPP 家庭作业6.34

第一步先求(S,E,B,m) 题目说共C32个字节,块大小B为16个字节,那就是分为两组:0,1.然后每组存4个int 每个4字节 CB*E*S .B16 ,直接映射的E就是1,所以S2 m为啥等于7? 通过写出两个数组所有的地址可以得出m7. 得出高速缓存的参数:(S,E,B,m)(2,1,16,7),注意图6-26每个参数的定义…

官网首屏:太漂亮了,真是着了它的魔,上了它的道。

大气的企业官网致力于提供用户友好的界面和优质的用户体验。网页经过精心设计和开发&#xff0c;旨在展示客户的品牌形象和产品信息&#xff0c;并为用户提供便捷的服务和沟通渠道。 官网设计追求简洁、美观、易用的原则&#xff0c;以吸引用户的注意力并提供清晰的导航和信息…

【MySQL】(基础篇十一) —— 分组数据

分组数据 本文介绍如何分组数据&#xff0c;以便能汇总表内容的子集。这涉及两个新SELECT语句子句&#xff0c;分别是GROUP BY子句和HAVING子句。 数据分组 经过上一节的学习&#xff0c;我们可以使用聚集函数查找到某个个工种拥有的员工数量&#xff08;count函数&#xff…

iCloud200g教育版云盘热点问题被锁根本原因经验博文

内幕现象 关于iCloud账号购买&#xff0c;笔者以为从某多闲鱼某宝都是不靠谱的&#xff0c;因为这些地方都是搞无货源模式&#xff0c;商家不是管理员只是倒卖的中介&#xff0c;而且这些平台是禁止交易虚拟网络账号的&#xff0c;所以很多这些平台商家都是以极低的价格出售快…

后端项目怎么做?怎么准备面试,看这篇就够了!

近期群友都在海投&#xff0c;广撒网&#xff0c;为的就是等一个面试机会&#xff0c;等一个offer。 当收到面试通知的时候&#xff0c;大家一定要好好把握机会。 机会很重要&#xff0c;给你机会&#xff0c;没有把握住&#xff0c;那就比较尴尬了。 对于研发岗位来说&…

sqoop的安装配置

1. 上传并解压安装包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../server/ 重命名&#xff1a;mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop 2. 配置环境变量 sudo vim /etc/profile # 配置sqoop的环境变量 export SQOOP_HOME/export/server/sqoop export PATH$PATH…

增加软件投入的重要性:提升自动化程度与用户界面设计的价值

一、引言 在许多项目中&#xff0c;硬件系统通常占据了大量预算&#xff0c;而对软件的投入相对较少。这种不平衡往往导致软件自动化程度低、操作不便、界面简陋&#xff0c;过多的人工干预不仅降低了工作效率&#xff0c;还影响了用户体验。特别是对于一些国家项目&#xff0…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

UML与设计模式

1、关联关系 关联关系用于描述不同类的对象之间的结构关系&#xff0c;它在一段时间内将多个类的实例连接在一起。关联关系是一种静态关系&#xff0c;通常与运行状态无关&#xff0c;而是由“常识”、“规则”、“法律”等因素决定的&#xff0c;因此关联关系是一种强关联的关…