当前位置: 首页 > news >正文

mit6824-01-MapReduce详解

文章目录

  • MapReduce简述
  • 编程模型
  • 执行流程
    • 执行流程
    • 排序保证
    • Combiner函数
    • Master数据结构
  • 容错性
    • Worker故障
    • Master故障
  • 性能提升
    • 定制分区函数
    • 局部性
    • 执行缓慢的worker(slow workers)
  • 常见问题总结回顾
  • 参考链接

MapReduce简述

MapReduce是一个在多台机器上并行计算大规模数据的软件架构。主要通过两个操作来实现:Map 和 Reduce:用于大规模数据集(大于1TB)的并行运算。

概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

编程模型

计算采用一组输入 K/V 对,并产生一组输出 K/V 对。MapReduce 库将计算表示为由用户编写的两个函数:

  1. map():根据输入生成一组中间 K/V 对。 MapReduce 库将所有具有相同 Key ki的 K/V 对传递给 Reduce 函数;reduce():
  2. 将 ki对应的所有值合并成 Value Set,并能通过迭代器访问;

map-reduce经典举例即统计字母出现的次数,多个进程各自通过map函数统计获取到的数据片段的字母的出现次数;后续再通过reduce函数,汇总聚合map阶段下每个进程对各自负责的数据片段统计的字母出现次数。伪代码如下所示:

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// value: a list of countsint result = 0;for each v in values:result += ParseInt(v);Emit(AsString(result));// map 函数发出每个单词及其出现次数。 reduce 函数统计特定单词发出的所有次数。

执行流程

执行流程

MapReduce操作总执行流程如下:
在这里插入图片描述

  • Master进程,被称为coordinator协调器,负责orchestrate编排wokers,把map jobs分配给它们
  • reduce、map被称为task任务
  1. MapReduce 库首先将输入文件 split 成 M 块,然后,它会在集群上启动该程序的多个副本;
  2. 其中一个副本是 Master(在 lab1 中称为 Coordinator),其余的是由 Master 分配工作的 Worker。有 M 个 map 任务和 R 个 reduce 任务要分配。 Master 为每个空闲的 Worker 分配一个任务;
  3. map Worker 从输入数据中解析出 K/V 对,并将每一对传递给 map 函数,生成的中间 K/V 对并缓存在内存中;
  4. 缓冲的 K/V 对定期被写入本地磁盘,由分区函数划分为 R 个区域。Master 获取这些缓冲对的位置并负责将这些位置转发给 reduce Worker;
  5. 当 Master 通知 reduce Worker 这些位置时,它使用 RPC 从 map Worker 的本地磁盘读取缓冲数据。当 reduce Worker 读取所有中间数据时,它会根据中间键对其进行排序,以便将所有出现的相同键组合在一起;
  6. reduce Worker 迭代排序的中间数据,对于遇到的每个唯一中间键,它将键和相应的中间值集传递给用户的 reduce 函数。 reduce 函数输出 append 到对应分区的最终文件中;
  7. 当所有的 map 任务和 reduce 任务都完成后,Master 唤醒用户程序,从 MapReduce 调用中返回;

排序保证

MapReduce 保证在给定的分区内,中间 K/V 对以 Key 递增顺序进行排列。从而保证每个分区的输出文件也是有序的——这在输出文件需要支持按键随机访问查找时很有用,同时可以对不同文件使用归并排序。具体实现时机:

Map Worker 中最后进行一次排序。

Combiner函数

在某些情况下,Map 函数产生的中间 key 值的重复数据会占很大的比重(例如词频统计,将产生成千上万的 <the, 1> 记录)。用户可以自定义一个可选的 Combiner 函数,Combiner 函数首先在本地将这些记录进行一次合并,然后将合并的结果再通过网络发送出去。
在这里插入图片描述
Combiner 函数的代码通常和 Reduce 函数的代码相同,启动这个功能的好处是可以减少通过网络发送到 Reduce 函数的数据量。

Master数据结构

Master 存储所有任务的状态( idle 、 in-progress 或 completed )和分配给所有工作机器执行的任务,以及由 map 任务生成的 R 个中间文件区域的位置和大小。当 map 任务完成时,对此位置和大小信息的更新被递增地推送给 reduce Worker。

容错性

Worker故障

Master 周期性地 ping 每个 Worker,如果 Worker 超时未回应,则将其标记为 Failed。
Worker 故障容错遵循以下原则:

  • map 任务被 Worker 完成后将重置为 idle 状态,以便调度给其他 Worker;
  • Failed Worker 未完成的任何任务将重置为 idle 状态;
  • Failed Worker 已完成的 map 任务将重新执行,因为它们的输出存储在故障机器的本地磁盘上,无法访问;
  • Failed Worker 已完成的 reduce 任务无需重新执行,因为它们的输出存储在全局文件系统中;
  • 当一个 map 任务因 WorkerA 失败转而由 WorkerB 执行,所有 reduce Worker 会收到重新执行的通知,任何尚未从 Worker A 读取数据的 reduce 任务将从 Worker B 读取数据;

Master故障

对于Master故障,我查到的资料显示:

Master 故障:中止整个 MapReduce 运算,重新执行。一般很少出现 Master 故障。

Google当初设计MapReduce时设计协调器不允许失败。如果协调器真的失败了,整个job(包含具体的多个map、reduce步骤task)需要重新运行。在这篇论文中,没有谈论到协调器失败后他们的应对方式。

(协调器不允许失败)这使得容错性很难做得更高,因为它维护一些工作状态(每个map、reduce函数执行的状态),在论文的库中,协调器不能失败。

后面会谈论一些技术手段,可以实现协调器容错,他们可以这么做却不打算,原因是他们认为比起协调器,运行map函数的上千个机器中崩溃一台的概率更高(也就是收益和成本不成正比,所以暂时没有实现协调器容错的打算)。

性能提升

定制分区函数

MapReduce 库的用户可以自定义分区函数来应对不同应用场景。例如,使用 hash(Hostname(urlkey)) % R 作为分区函数可以使来自同一主机的所有 URL 最终出现在同一个输出文件中。

局部性

就近原则:
Google发表该 paper 时,网络带宽是一个相当匮乏的资源。Master 在调度 Map 任务时会考虑输入文件的位置信息,尽量将一个 Map 任务调度在包含相关输入数据拷贝的机器上执行;如果找不到,Master 将尝试在保存输入数据拷贝的附近的机器上执行 Map 任务。

需要注意的是,新的讲座视频提到,随着后来 Google 的基础设施的扩展和升级,他们对这种存储位置优化的依赖程度降低了。

执行缓慢的worker(slow workers)

MapReduce操作所用总时间受短板效应影响:
比如GFS也在同一台机器上运行占用大量的机器周期或带宽,或硬件本身问题,导致worker执行map/reduce很慢。慢的worker被称为straggler,当剩下几个map/reduce任务没有执行时,协调者会另外分配相同的map/reduce任务到其他闲置worker上运行,达到backup task(备份任务)的效果(因为函数式,map/reduce以相同输入执行最后会产生相同输出,所以执行多少次都不会有问题)。

  • 通过backup task,性能不会受限于最慢的几个worker,因为有更快的worker会领先它们完成task(map或reduce)。这是应对straggler的普遍做法,通过replicate tasks复制任务,获取更快完成task的输出结果,处理了tail latency尾部延迟问题。

常见问题总结回顾

  • 在远程读取进程中,文件是否会传输到reducer?

会。map函数产生的中间结果存放在执行map函数的worker机器的磁盘上,而之后解调器分配文件给reducer执行reduce函数时,中间结果数据需要通过网络传输到reducer机器上。这里其实很少有网络通信,因为一个worker在一台机器上,而每台机器同时运行着worker进程和GFS进程。worker运行map产生中间结果存储在本地,而之后协调器给worker分配文件以执行reduce函数时,才需要通过网络获取中间结果数据,最后reduce处理完在写入GFS,写入GFS的动作也往往需要通络传输。

  • 协调器是否负责对数据进行分区,并将数据分发到每个worker或机器上?

不是的。mapreduce运行用户程序,这些输入数据在GFS中。(也就是说协调器告知worker从GFS取哪些数据进行map,后续协调器又告知worker从哪些worker机器上获取中间结果数据进行reduce,最后又统一写入到GFS中)

  • 排序是如何工作的?比如谁负责排序,如何排序?

中间结果数据传递到reduce函数之前,mapreduce库进行一些排序。比如所有的中间结果键a、b、c到一个worker。比如(a,1) (b,1) (c,1) (a,1) 数据,被排序成(a,1) (a,1) (b,1) (c,1) 后才传递给reduce函数。

  • map是否会被执行两次?
  • 如果coordinator没有收到worker反馈task任务完成,那么会coordinator重新分配worker要求执行task(可能分配到同一个worker,重点是task会被重新执行)
  • 或许没反馈task执行done完成的worker是遇到网络分区等问题,并没有宕机,或者协调者不能与worker达成网络通信,但实际上worker仍然在运行map任务,它正在产生中间结果。

同一个map可以被运行两次。 被执行两次是能够接受的(幂等性问题),正是map和reduce属于函数式(functional)的原因之一。如果map/reduce是一个funcitonal program,那么使用相同输入运行时,产生的输出会是相同的(也就是保证幂等)。

  • reduce能够被执行两次吗?

reduce和map出于相同的原因,从容错的角度上看,执行reduce函数和map函数并没有太大区别。需要注意的是,这时候可能有两个reducer同时有相同的输出文件需要写入GFS,它们首先在全局文件系统GFS中产生一个中间文件,然后进行atomic rename原子重命名,将文件重命名为实际的最终名称。因为在GFS中执行的重命名是原子操作,最后哪个reducer胜出并不重要,因为reduce是函数式的,它们最终输出的数据都是一样的。

  • 一台机器应该可以执行多个map任务,如果它分配10个map任务,而在执行第7个map任务时失败了,master得知后,会安排将这7个已完成的map任务分布式地重新执行,可能分散到不同的map机器上,对吗?

是的。但是通常一台机器只运行一个map函数或一个reduce函数,而不是多个。

  • 在worker完成map任务后,它是否会直接将文件写入其他机器可见的位置,或者只是将文件保存到自己的文件系统中?

map函数总是在本地磁盘产生结果,所以中间结果文件只会在本地文件系统中。

  • 即使一次只做一个map任务,但是如果执行了多次map任务后,如果机器突然崩溃,那么会丢失之前负责的所有map任务所产生的中间结果文件,对吗?

中间结果文件放在文件系统中。所以当机器恢复时,中间结果文件还在那里,因为文件数据是被持久化保存的,而不是只会存在于内存中(换句话说,这里依赖了操作系统的文件系统本身的容错性)。并且map或reduce会直接访问包含intermediate results中间结果的机器。

参考链接

链接一
链接二
链接三

相关文章:

mit6824-01-MapReduce详解

文章目录 MapReduce简述编程模型执行流程执行流程排序保证Combiner函数Master数据结构 容错性Worker故障Master故障 性能提升定制分区函数局部性执行缓慢的worker(slow workers) 常见问题总结回顾参考链接 MapReduce简述 MapReduce是一个在多台机器上并行计算大规模数据的软件架…...

在Docker中运行微服务注册中心Eureka

1、Docker简介&#xff1a; 作为开发者&#xff0c;经常遇到一个头大的问题&#xff1a;“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中&#xff0c;避免了因环境差异带来的兼容性问题&#xff0c;能够有效的解决此类问题。 通过Docker&#xff0c;开发者可…...

白话进程>线程>协程

文章目录 概述进程线程协程区别与联系 举个栗子进程例子线程例子协程例子区别与联系的具体体现 代码示例进程例子线程例子协程&#xff08;Goroutine&#xff09;例子 概述 进程、线程和协程是计算机科学中的基本概念&#xff0c;它们在操作系统和并发编程中扮演着重要角色。以…...

论文阅读:Attention is All you Need

Abstract 贡献&#xff1a; 提出了Transformer&#xff0c;完全基于注意力机制&#xff0c;摒弃了循环和卷积网络。 结果&#xff1a; 本模型在质量上优于现有模型&#xff0c;同时具有更高的并行性&#xff0c;并且显著减少了训练时间。 1. Introduction long short-term …...

【Linux 】文件描述符fd、重定向、缓冲区(超详解)

目录 ​编辑 系统接口进行文件访问 open 接口介绍 文件描述符fd 重定向 缓冲区 1、缓冲区是什么&#xff1f; 2、为什么要有缓冲区&#xff1f; 3、怎么办&#xff1f; 我们先来复习一下&#xff0c;c语言对文件的操作&#xff1a; C默认会打开三个输入输出流&#xf…...

Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)

反向代理与跨域描述 什么是跨域&#xff1f; 跨域&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是指在浏览器中&#xff0c;当一个网页的脚本试图从一个域名&#xff08;协议、域名、端口&#xff09;请求另一个域名的资源时&#xff0c;浏览器会阻止这种请求…...

视频转文字免费的软件有哪些?6款工具一键把视频转成文字!又快又方便!

视频转文字免费的软件有哪些&#xff1f;在视频制作剪辑过程中&#xff0c;我们经常进行视频语音识别成字幕&#xff0c;帮助我们更好地呈现视频内容的观看和宣传&#xff0c;市场上有许多免费的视频转文字软件&#xff0c;可以快速导入视频&#xff0c;进行视频内音频的文字转…...

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…...

Python机器学习模型的部署与维护:版本管理、监控与更新策略

&#x1f680; Python机器学习模型的部署与维护&#xff1a;版本管理、监控与更新策略 目录 &#x1f4bc; 模型版本管理 使用DVC进行数据和模型的版本控制&#xff0c;确保可复现性 &#x1f50d; 监控与评估 部署后的模型性能监控&#xff0c;使用Prometheus和Grafana进行实…...

免费送源码:Java+ssm+JSP+Ajax+MySQL SSM汽车租赁管理系统 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对汽车租赁信息管理等问题&#xff0c;对其进…...

Vivado viterbi decoder license

Viterbi Decoder 打卡以上链接 添加后next后&#xff0c; 会发送lic文件到邮件&#xff0c;vivado导入lic即可...

【FastAdmin】PHP的Trait机制:代码复用的新选择

PHP的Trait机制&#xff1a;代码复用的新选择 大家好&#xff0c;我是田辛老师。最近收到很多同学的私信&#xff0c;询问关于PHP中Trait机制的相关问题。今天&#xff0c;我们就来详细探讨一下这个强大的代码复用工具&#xff0c;以及它在ThinkPHP 5&#xff08;简称Tp5&…...

小红书制作视频如何去原视频音乐,视频如何去原声保留背景音乐?

在视频编辑、音乐制作或个人娱乐中&#xff0c;有时我们希望去掉视频中的原声&#xff08;如对话、解说等&#xff09;&#xff0c;仅保留背景音乐。这种处理能让观众更加聚焦于视频的氛围或节奏&#xff0c;同时也为创作者提供了更多创意空间。选择恰当的背景音乐&#xff0c;…...

netty之Netty使用Protobuf传输数据

前言 在netty数据传输过程中可以有很多选择&#xff0c;比如&#xff1b;字符串、json、xml、java对象&#xff0c;但为了保证传输的数据具备&#xff1b;良好的通用性、方便的操作性和传输的高性能&#xff0c;我们可以选择protobuf作为我们的数据传输格式。目前protobuf可以支…...

【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180

四题都比较简单&#xff0c;可以直接秒。 1. 力扣2082&#xff1a;富有客户的数量 1.1 题目: 表&#xff1a; Store ------------------- | Column Name | Type | ------------------- | bill_id | int | | customer_id | int | | amount | int | -------------…...

快速了解Java中的15把锁!

目录 了解 总览 乐观锁 悲观锁 互斥锁和同步锁 公平锁 非公平锁 自旋锁 可重入锁&#xff08;递归锁&#xff09; ReadWriteLock读写锁 共享锁 独占锁 偏向锁 轻量级锁 重量级锁 锁优化 在 Java 中&#xff0c;锁是一种用于实现多线程之间同步和互斥的机制。 了…...

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同&#xff0c;类型也在改变&#xff0c;以后怎么写类型&#xff1f; yarn add axios1. 封装Axios 将Axios封装成一个类&#xff0c;同时重新封装request方法 重新封装request有几个好处&#xff1a; 所有的请求将从我们定义的requet请求中发送&#xff…...

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…...

作文-杭州游记

杭州的学习与游历 在这个风景如画的城市——杭州&#xff0c;学习信息学的日子如同西湖的水&#xff0c;清澈而又深邃。在这里&#xff0c;课堂与自然的交融、技术与文化的碰撞&#xff0c;构成了一幅独特的画卷。 学习之旅 信息学的课程不仅仅是对代码和算法的解析&#xff0…...

降压芯片TPS54821

降压芯片TPS54821 介绍 价格低廉&#xff0c;只需1.5元。是一个同步整流降压BUCK电路。MOS管内置。输入电压为4.5V至17V&#xff0c;输出电压为0.6V到15V&#xff0c;输出电流最大到8A。是QFN封装&#xff0c;焊接时有些许困难。得益于QFN封装&#xff0c;其引线电感非常的小…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...