MapReduce Simplified Data Processing on Large Clusters 论文笔记

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 contentsfor each word w in value:EmitIntermediate(w, "1");reduce(String key, Iterator values):// key: a word// values: a list of countsint 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.mzph.cn/pingmian/27949.shtml

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

相关文章

“论面向对象的建模及应用”必过范文,突击2024软考高项论文

论文真题 软件系统建模是软件开发中的重要环节&#xff0c;通过构建软件系统模型可以帮助系统开发人员理解系统&#xff0c;抽取业务过程和管理系统的复杂性&#xff0c;也可以方便各类人员之间的交流。软件系统建模是在系统需求分析和系统实现之间架起的一座桥梁&#xff0c;…

C#操作MySQL从入门到精通(15)——分组数据

前言 我们有时候需要对数据库中查询的数据进行分组,所谓分组就是将相同的数据分为一组,本次测试使用的数据库数据如下: 1、分组 分组使用group by关键词,下面的代码的意思是对查询的结果按照student_age进行分组,student_age相同的划分为同一组 string sql = string.E…

vue3-sfc-loader动态加载一个异步vue组件生成cesium画面

在 Vue.js 3 中&#xff0c;使用 vue3-sfc-loader 可以动态加载异步的 Vue 单文件组件&#xff08;.vue 文件&#xff09;。这个工具允许你在运行时根据需要加载和解析 .vue 文件&#xff0c;使得组件的加载变得更加灵活和动态。 下面是一个简单的示例&#xff0c;演示如何使用…

没有学历,没有基础,是否能成为一个嵌入式工程师?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 嵌入式其实涵盖的知识非常…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门

Elasticsearch ES简介 分布式全文搜索引擎 我们天天在用ES 搜索的时候 要与多个信息进行匹配查找 然后返回给用户 首先 ES会将数据库中的信息 先进行一个拆分 这个叫做分词 是按照词语关键词拆的 然后就能进行搜索的时候匹配对应的id 每一个关键字对应若干id 每一个…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

C++ 18 之 函数的重载

c18函数的重载.cpp #include <iostream> #include <string.h> using namespace std;void fun4(int a) {cout << "int a: "<< a << endl; } void fun4(double a) {cout << "double a: " << a << endl; }v…

24年河北自考报名流程详细教程汇总

2024年河北自考本科报名马上就要开始了&#xff0c;想要参加考试报名的同学&#xff0c;提前看一下&#xff0c;了解一下报名流程&#xff0c;准备一些报名材料。 报名时间&#xff1a;2024年1月5日—10日8:00—22:00 考试时间&#xff1a;2024年4月13日—14日 报名照要求&…

ControlNet作者新作Omost 一句话将LLM的编码能力转化为图像生成能力,秒变构图小作文,再也不用为不会写提示词担心了!

近日&#xff0c;ControlNet的作者推出了一个全新的项目—Omost。Omost是一个将LLM的编码能力转化为图像生成能力的项目。对现有图像模型的提示词理解有着巨大的帮助。通过很短的提示词&#xff0c;就可以生成非常详细并且空间表现很准确的图片。 完美解决新手小白不会写提示词…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱&#xff0c;这在全球范围内得到广泛认同&#xff0c;为了让入伍的新兵能快速熟悉和掌握武器装备操作流程&#xff0c;基于创新型的华锐3D云展平台工具&#xff0c;搭建的3D军事武器展示搭建编辑器&#xff0c;让部队的军事武器展示…

Solidity智能合约事件(event)

文章目录 Solidity智能合约事件(event)什么是event事件event有什么作用日志内容位于区块链的什么地方&#xff1f;【重要】以太坊交易获取如何在 Solidity 中使用事件&#xff1f;参考 Solidity智能合约事件(event) 什么是event EVM有一个日志功能&#xff0c;用于将数据“写…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

C#批量设置海康和大华录像机NVR,GB28181的通道编码.

我经常要把小区海康或者大华的硬盘录像机推送到自己搭建的gb28181监控平台,每次几百个摄像头编码,有点头大,就用了1个多周写了个批量设置海康和大华硬盘录像机的通道编码的程序,海康和大华的SDK简直不是人看的. 太乱了. 大华读取通道编码的代码 /// <summary>/// 获取通道…

自动生成企业培训视频:创新与效率的完美结合

前言 随着人工智能技术的飞速发展&#xff0c;大模型技术在各个领域的应用日益广泛。在企业培训领域&#xff0c;大模型技术的应用为培训视频的生成带来了革命性的变革。本文将探讨如何利用大模型技术自动生成企业培训视频&#xff0c;以及这一技术为企业培训带来的创新和效率…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层&#xff0c;用于简化JDBC开发 1步中的实体类 int类型一般用Integer &#xff1a;如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台 请访问原文链接&#xff1a;https://sysin.org/blog/opnsense/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 关于 OPNsense OPNsense 是一个开源、易于使用且易于构建…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…