浅谈MapReduce

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 countsint 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/*
doecho -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.mzph.cn/news/226095.shtml

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

相关文章

clickhouse函数记录

日期函数 SELECT formatDateTime(create_time,%Y-%m-%d) AS time FROM xx.xx;

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后,后按照Tools->IP Generator顺序,创建IP核,如下图: 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图,生成的.v文件只…

【Linux】内核结构

一、Linux内核结构介绍 Linux内核结构框图 二、图解Linux系统架构 三、驱动认知 1、为什么要学习写驱动2、文件名与设备号3、open函数打通上层到底层硬件的详细过程 四、Shell Shell脚本 一、Linux内核结构介绍 Linux 内核是操作系统的核心部分,它负责管理系…

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性,并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望,我们提供了对这些话题更深层次…

HBuilderX 配置 夜神模拟器 详细图文教程

在电脑端查看App的效果,不用真机调试,下载一个模拟器就可以了 --- Nox Player,夜神模拟器,是一款 Android 模拟器。他的使用非常安全,最重要的是完全免费。 一. 安装模拟器 官网地址: (yeshen.com) 二.配…

探索性能测试的奥秘:流程与工具大揭秘!

一、性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1.1 类别 性能测试包括负载测试、压力测试、基准测试等。 1.1.1 负载测试 通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证…

【MYSQL】事务隔离级别、脏读、不可重复读、幻读

文章目录 介绍演示脏读不可重复读可重复读幻读 不可重复读和幻读的区别 参考 作者 Guide: 事务隔离级别 美团技术团队: Innodb中的事务隔离级别和锁的关系 介绍 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交) :最低的隔离级别…

论文阅读——Semantic-SAM

Semantic-SAM可以做什么: 整合了七个数据集: 一般的分割数据集,目标级别分割数据集:MSCOCO, Objects365, ADE20k 部分分割数据集:PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…

java简易制作-王者荣耀游戏

一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt; import javax…

【设计模式--行为型--观察者模式】

设计模式--行为型--观察者模式 观察者模式定义结构案例优缺点使用场景JDK中提供的实现例:警察抓小偷 观察者模式 定义 又被成为发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生…

INFINI Labs 产品更新 | Easysearch 新增快照搜索功能,Console 支持 OpenSearch 存储

INFINI Labs 产品又更新啦~,包括 Easysearch v1.7.0、Console v1.13.0。本次各产品更新了 Easysearch 快照搜索功能;Console 支持 OpenSearch 集群存储系统数据、优化了初始化安装向导流程等。 以下是本次更新的详细说明。 INFINI Easysearch v1.7.0 …

遥感论文 | ISPRS | 图神经网络也能做城市街道功能感知?纯视觉方案,效果可观!

论文题目:Knowledge and topology: A two layer spatially dependent graph neural networks to identify urban functions with time-series street view image论文网址:https://www.sciencedirect.com/science/article/pii/S0924271623000680论文代码&…

【lesson16】进程控制之进程替换(1)

文章目录 进程替换是什么?进程替换怎么用?不创建子进程时使用 进程替换是什么? 我们知道fork()之后,父子进程各自执行父进程的一部分代码,如果子进程就想执行一个全新的程序呢? 以前:父子代码…

K8S(二)—介绍

K8S的整体结构图 k8s对象 在 Kubernetes 系统中,Kubernetes 对象是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。 具体而言,它们描述了如下信息: 哪些容器化应用正在运行(以及在哪些节点上运行)可…

微服务实战系列之ZooKeeper(中)

前言 昨日博主的第一篇ZooKeeper,对它自身具备的能力做了初步介绍。书接上文,马不停蹄,我们继续挖掘它内在的美,充分把握它的核心与脉络。 揭秘ZooKeeper Q:集群一致性协同是如何进行的 我们讲到分布式,…

Renyi散度:Renyi divergence

有关Renyi散度的基本介绍挺多博客已经写了。本文章主要介绍最基础的概念,以及近些年论文中为啥老喜欢引用这个概念。 一.基础概念 Renyi散度主要是描述两个分布之间的关系。对一个离散的概率分布X,其定义域记作,其实就是概率不为零的点的集…

React脚手架搭建

React脚手架 脚手架:可以快速构建项目的基本架构。 脚手架安装命令 可全局安装脚手架 创建项目 来到当前目录下 create-react-app 项目名(不要大写字母) 运行项目 进到项目里,在项目目录下,执行 npm start &#xff…

C语言-Makefile

Makefile 什么是make? make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件,这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候, m…

华为数通——路由冗余和备份

注:当一条路由的出接口down时,该路由会自动失效。 要求:数据优先走千兆链路。 R1 [ ]ip route-static 172.16.1.0 24 12.1.1.2 目的地址 掩码 下一条 [ ]ip route-static 172.16.1.0 24 21.1.1.2 preference 50 目的地址 …

OxLint 发布了,Eslint 何去何从?

由于最近的rust在前端领域的崛起,基于rust的前端生态链遭到rust底层重构,最近又爆出OxLint,是一款基于Rust的linter工具Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价;你或许不知道OxLint,相比ES…