浅谈MapReduce

news2024/10/5 14:27:29

MapReduce是一个抽象的分布式计算模型,主要对键值对进行运算处理。用户需要提供两个自定义函数:

  • map:用于接受输入,并生成中间键值对。
  • reduce:接受map输出的中间键值对集合,进行sorting后进行合并和数据规模的缩减,并进行期望信息的提取。
    用户通过map和reduce函数声明键值对的处理方式,而调度,并行计算和容灾等底层问题则是对用户透明的。

1、示例

1.1 词频统计

在这个案例中,目标是将文本作为输入,将其中的单词出现频率进行统计。 此时,map和reduce的伪代码如下:

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));

map函数通过接受文本(这里输入的是文本的名字)作为key,文本的内容作为value,并通过遍历文本中的单词来生成单词/出现频率的键值对。这里单个单词被遍历的时候,出现频率的贡献都为1。 在这过程中,相同的key会被整合到一起作为中间键值对交付给reduce。 reduce函数则接受中间键值对,单词作为key,一个列表作为value(实际上由于每个单词的贡献为1,因此列表的长度就为单词的出现频率)统计出来单词的出现频率。具体方法如上述伪代码,将每个word的出现频率相加。

golang实现版本如下
在这里插入图片描述

1.2 气象数据

在这个例子当中,要写一个关于气象数据的分析程序。分布在全球各地的很多气象传感器每隔一小时收集气象数据和大量日志数据,且这些数据按行并以ASCII格式存储,半结构化且按照记录方式存储,很适合用MapReduce来分析。

如下图,这是一行采样数据,其中重要字段添加了注释。这一行数据被分成很多行以突出每个字段,但实际是存储在一行中,没有分隔符的。
在这里插入图片描述

数据文件按照日期和气象站进行组织。从1901年到2001年,每一年都有一个目录,包含各个气象站该年气象数据的打包文件和说明文件。
在这里插入图片描述

现在,我们的目的是要提取出每一年的最高气温。 假设我们现在需要统计传统处理按行存储数据的工具是awk,如该脚本

#!/usr/bin/env bash
for year in all/*
do
    echo -ne `basename $year .gz`"\t"
    gunzip -c $year | \
    awk'{ temp = substr($0,88,5) + 0;
          q = substr($0,93,1);
          if(temp != 9999 && q ~ /[01459]/ && temp > max) max = temp}
        END {print max}'
    done

这个脚本遍历压缩文件,首先显示年份,然后使用awk处理每一个文件。 awk主要提取两个字段:气温和质量代码。气温+0后转换成整数,然后测试气温值是否有效。用9999代替NCDC数据中丢失的值。如果数据读取正确,那么就和目前的最大值进行比较。如果比目前的最大值大,那么替换最大值。 处理完所有行之后,再输出最大气温值。 如下是部分运行结果(这里的气温值被放大了十倍,1901年的最高温度是31.7度)
在这里插入图片描述

为了加快速度,我们需要并行数据分析。 同样还是两个阶段,map和reduce。map函数很简单,我们只对年份和气温感兴趣,因此将数据中的行作为输入,将气温和年份等提取出来。提取之后,将年份相同,也就是key相同的值聚合到一起,交付给reduce。reduce函数对每个key选出一个最大的气温值即可。 此处,我们假设一行中属性的偏移量是固定的,如下每一行的字体标粗部分分别为年份和气温
在这里插入图片描述

key是文件中的行偏移量,我们不需要因此忽略。我们只需要提取出来年份和气温即可,就有

(1950,0)
(1950,22)
(1950,-11)
(1949,111)
(1949,78)

reduce将相同key的键值对进行排序与整合,因此有

(1949,[111,78])
(1950,[22,0,-11])

最后,reduce遍历每一个键值对,将最大的值选出来,就是我们需要的数据。

(1949,111)
(1950,22)

从这个例子,我们可以看出来mapreduce的流程

  • input:将输入文件作为键值对进行输入
  • map:map函数将键值对的信息提取出来,生成中间键值对
  • shuffle:对中间键值对进行整合,聚合相同的key
  • reduce:遍历key,对每一个key选出我们需要的信息
  • output:输出
    在这里插入图片描述

2、 架构

MapReduce框架主要由三个部分组成

  • User Program
  • Master
  • Worker
    其中,User Program是用户的自定义程序。
    Master节点不对任务进行处理,而是对Worker进行任务调度和状态收集。
    Worker则是实际进行计算的节点,既可以进行Map也可以进行Reduce,取决于分配到的任务是什么。

在这里插入图片描述

传入Map的输入数据会被自动切分成M个数据片段,用于分布到多台机器上并行处理。 利用分区函数,将Map生成的中间键值对分成R个不同的分区,以此让R个reduce worker也并行地进行reduce工作。

分区数量R和分区函数由用户指定,以下是一个简单的实现

在这里插入图片描述

其中KeyValuePairs是经过调用了mapF生成的中间键值对。在下面的循环中,通过对键值对的key进行hash函数得到哈希值,然后再模nReduce得到分区位置。也就是hash(key)%nReduce 由user program调用MapReduce开始

  • 1.MapReduce库将输入文件分块,通常分成M份16到64MB。然后,他会在集群中启动多个程序副本。
  • 2.worker读入数据,解析并传入map函数。map函数生成的中间k/v对会被缓存在内存中。
  • 3.每隔一段时间,内存中的k/v对会被写到磁盘,并分区到R个区域内。这些区域的位置会告知master,然后master转发给reducer去消费这些数据。
  • 4.reducer被告知位置之后,它会采用RPC的方式读取保存了这些k/v对的磁盘。当一个reduce worker读取完所有中间键值对之后,该reducer会对这些键值对进行排序。这是因为,许多不同的key会映射到同一个reduce任务中。如果数据量太大而无法全部导入到内存中,则需要进行外部排序。
  • 5.reducer会对这些排序后的中间k/v对进行遍历,然后对于每个唯一的key的value集合传入reduce函数中,最后追加到reduce分区的输出文件中。
  • 6.完成后master唤醒用户程序,用户程序结束调用

2.1 简单的实现

首先,创建nReduce个文件,文件名则是通过一个函数来创建的,目的是方便reduce worker通过有规律的名字去寻找这些文件。 然后通过调用用户自定义的mapF函数,将输入文件拆分成键值对。 遍历键值对,利用ihash(kv.key)%nReduce计算得到文件下标,并将键值对附加到该文件上。

在这里插入图片描述

reduce通过reduceName约定的名字从文件中寻找自己消费的文件。 然后遍历中间键值对,利用sort对这些键值对进行排序(key相同的键值对都会被排到一起) 然后调用reduceF函数进行reduce,最后输出到文件当中。

在这里插入图片描述在这里插入图片描述

2.2 Master的数据结构

Master中保存了每个Map任务和每个Reduce任务的状态(闲置,正在运行,以及完成),以及非空闲任务的worker机器的ID。 Master的数据结构之所以要保存这些,是因为需要保证容灾能力。

2.3 容灾

2.3.1 Worker故障

Master对Worker进行心跳检测。如果一定时间内无法ping通该worker,它就会被标记成failed。所有由该worker完成的map或reduce任务都会重新设置为初始的闲置状态,然后将这些任务重新分配给其他worker。 如果是完成map的worker,由于输出结果保存在worker的磁盘之中无法访问,因此就要重新运行。 如果是reducer的worker,结果已经存储在全局的文件系统中了,因此无需再次执行

2.3.2 Master故障

上文中我们提到,Master中保存了每个Map任务和每个Reduce任务的状态(闲置,正在运行,以及完成),以及非空闲任务的worker机器的ID。 master周期性的将上文的数据结构写入磁盘备份,如果出错了,就可以从这些数据结构中恢复状态。

2.3.3 任务粒度

我们将map和reduce任务分别拆分成了M个和R个子任务。理想情况下,M和R应该远大于worker的数量。每个worker也会执行不同的许多任务,以此保证负载均衡的能力。同时,worker故障了的话,通过能够将该机器的任务发送到其他完好的worker上加快恢复的速度 但M和R的数量不应过多,因为master需要在内存中保存O(M*R)个状态,需要执行O(M+R)次调度。过大的M和R会加重master的负担。

2.4 网络

网络带宽在这个模型中是一个相对稀缺的资源,因此MapReduce尽量将输入数据存储在本地的硬盘中以节约网络资源。 其中输入和输出是不可避免的网络通信,一般会通过一个分布式存储系统进行输入和存储,如GFS。 Master调度任务的时候会考虑文件的位置,尽量在调度一个包含该输入数据副本的机器上执行。如果任务失败,则会调度到同样有该副本的较近的机器上执行。 一种优化形式是令运行着GFS的集群进行。MapReduce工作,那么Master可以将任务分配给已经拥有该数据的Worker中,从而直接从本地磁盘进行读取,减少网络通信。

3、 总结

从上述的信息来看,MapReduce主要的优点有

  • 1.易于编程,用户只需要自定义map和reduce函数即可。
  • 2.具有良好的扩展性,可以通过增加worker的数量来扩展计算能力。
  • 3.具有一定的容灾能力,master可以通过定期写入一些持久化信息进行进度的备份,保证master挂了之后可以读取这些信息恢复;而worker挂了的话,它负责的任务可以由master重新调度给其他worker进行作业。
  • 4.适合PB级别以上大数据的离线处理。
    缺点主要有:
  • 1.不能实时计算,MapReduce处理的是存储在磁盘上的离线数据。
  • 2.不能流式计算,MapReduce设计处理的数据源是静态的。
  • 3.难以DAG计算,即多个任务存在拓扑的依赖关系,前一个任务的输出是另一个任务的输入。解决方法有Apache的Tez计算框架。
    总的来说,从MapReduce的所有长处来看,它基本是一个批处理系统,并不适合交互式分析。
    MapReduce处理的是存储在磁盘上的离线数据。
  • 2.不能流式计算,MapReduce设计处理的数据源是静态的。
  • 3.难以DAG计算,即多个任务存在拓扑的依赖关系,前一个任务的输出是另一个任务的输入。解决方法有Apache的Tez计算框架。
    总的来说,从MapReduce的所有长处来看,它基本是一个批处理系统,并不适合交互式分析。
    典型情况下,执行查询需要几分钟或更多时间。同时,MapReduce设计处理的数据源是静态的,因此,MapReduce更适合没有用户在现场等待查询结果的离线引用场景。

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

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

相关文章

RabbitMq交换机详解

目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…

Linux(23):Linux 核心编译与管理

编译前的任务:认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…

数据分析为何要学统计学(2)——如何估计总体概率分布

明确总体的概率分布类型及参数是进行数据分析的基础,这项工作称为分布推断与参数估计。在总体分布及其参数不明确的情况下,我们可以利用手头掌握的样本来完成这项工作。具体过程由以下步骤组成。 第一步,样本统计特性直观估计 我们采用Seab…

虚拟机VirtualBox和VMware安装Ubuntu16配置静态IP

计算机集群安装之前,准备先在虚拟机上尝试一下,网上多是采用VMware虚拟机和CentOS系统,个人则准备采用已经安装好的VirtualBox虚拟机和Ubuntu16,但遇到第一个问题即是配置静态IP,那么对于以上两种虚拟机静态IP配置的问…

(数据结构)单链表的查找和长度计算

代码实现 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //创建头结点 LNode* InitList(LinkList L) {L (LNode*)malloc(sizeof(LNode));if (L NULL){return NULL;}L->data 0;L->next N…

掌握STL中stack和queue的用法(零基础/小白,全方面了解)

目录 1. stack的概念 2. stack的接口 2.1 构造函数&#xff08;初始化&#xff09; 2.2 赋值 2.3 存取操作 2.4 大小操作 3. queue的概念 4. queue的接口 4.1 构造函数 4.2 赋值操作 4.3 存取操作 4.4 大小操作 stack和queue接口函数很少&#xff0c;只要大家多敲一两…

设计模式(3)--对象结构(3)--组合

1. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 2. 三种角色 抽象组件(Component)、组合式节点(Composite)、叶节点(Leaf) 3. 优点 3.1 定义了包含基本对象和组合对象的类层次结构。 客户代码中&…

八大排序——快速排序(霍尔 | 挖空 | 前后指针 | 非递归)

我们今天来讲讲八大排序中的快速排序&#xff0c;快速排序最明显的特点就是排序快&#xff0c;时间复杂度是O&#xff08;N* logN&#xff09;&#xff0c;但是坏处就是如果排序的是一个逆序的数组的时候&#xff0c;时间复杂度是O&#xff08;N^2&#xff09;,还不用我们的插入…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数&#xff08;1&#xff09;substring 截取字符串&#xff08;2&#xff09;replace 替换&#xff08;3&#xff09;regexp_replace 正则替换&#xff08;4&#xff09;regexp 正则匹配&#xff08;5&#xff…

操作系统期末复习-内存管理

一、内存管理 分页存储管理&#xff0c;是将一个进程的逻辑地址空间分成若干个大小相等的片&#xff0c;称为页面或页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;如第0页、第1页等。相应地&#xff0c;也把内存空间分成与页面相同大小的若干个存储块&#xf…

直线追踪

由于项目的需要&#xff0c;最近在做一个直线追踪的东西&#xff0c;但是网上的代码关于车道线或者别的什么之类的直线追踪的代码只是提了一下&#xff0c;相关的代码并不是公开的&#xff0c;所以自己写了一些直线追踪的代码。 代码使用的是kalman滤波进行直线追踪&#xff0…

完美解决labelimg xml转可视化中文乱码问题,不用matplotlib

背景简述 我们有一批标注项目要转可视化&#xff0c;因为之前没有做过&#xff0c;然后网上随意找了一段代码测试完美&#xff08;并没有&#xff09;搞定&#xff0c;开始疯狂标注&#xff0c;当真正要转的时候傻眼了&#xff0c;因为测试的时候用的是英文标签&#xff0c;实…

Sci. Rep. | 一个对任意分子体系实现准确且高效几何深度学习的通用框架

这篇工作是来自纽约城市大学/康奈尔医学院谢磊团队的一篇论文。作者提出了一个通用框架&#xff0c;PAMNet&#xff0c;可以对任意分子体系实现准确且高效的几何深度学习。在小分子性质、RNA三维结构以及蛋白质-配体结合亲和力的预测任务上&#xff0c;PAMNet在准确性和效率方面…

网络编程-认识套接字socket

文章目录 套接字概念端口号网络字节序 套接字类型流套接字数据报套接字 socket常见APIsocket函数bind函数listen函数accept函数connect函数sockaddr结构 套接字概念 socket套接字是进程之间一种通信机制&#xff0c;通过套接字可以在不同进程之间进行数据交流。在TCP/UDP中&…

将html的radio单选框自定义样式为正方形和对号

将html的radio单选框自定义样式为正方形和对号 背景&#xff1a; 如何能把html的<input type"radio" name"option">改成自定义的样式呢&#xff1f;比如想要把他变成正方形&#xff0c;选中的时候是对号。默认的样式太丑了 默认样式&#xff1a; 自…

[数学]三角形的五心之内心

三角形内心的性质 三角形内切圆的圆心称为三角形的内心。内心也是三角形三个角的角平分线的交点 性质1 1.1 设 I I I为 △ A B C △ABC △ABC内一点&#xff0c;则 I I I为 △ A B C △ABC △ABC内心的充要条件是下列条件之一&#xff1a; 1.1.1 I I I到 △ A B C △ABC △…

【C语言】RDMACM、Verbs API与epoll一起使用的示例

一、epoll介绍 epoll是Linux内核为处理大批量文件描述符而作了改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 以下是epoll的主要使用方法和优点&#xff1a; epo…

代码随想录刷题题Day15

刷题的第十五天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day15 任务 ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历…

整理了上百个开源中文大语言模型,涵盖模型、应用、数据集、微调、部署、评测

自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮自然语言处理领域的研究和应用的浪潮。 尤其是以ChatGLM、LLaMA等平民玩家都能跑起…