【大数据】计算引擎MapReduce

目录

1.概述

1.1.前言

1.2.大数据要怎么计算?

1.3.什么是MapReduce?

2.架构

3.工作流程

4.shuffle

4.1.map过程

4.2.reduce过程


1.概述

1.1.前言

本文是作者大数据系列专栏的其中一篇,专栏地址:

https://blog.csdn.net/joker_zjn/category_12631789.html?spm=1001.2014.3001.5482

本文将会聊一下计算引擎MapRedduce,深入浅出快速过一遍MapReduce的核心概念和原理,不涉及具体操作,具体操作将会在下文聊。

1.2.大数据要怎么计算?

大数据集的数据是海量的,动辄几十上百TB,为了能将其存下来都是采用的分布式存储,将整个数据集分散到多个节点上去。要对其做统计之类的计算时,肯定不能数据向计算靠拢,将数据全部读到一个跑计算任务的节点上来进行计算,只能计算向数据靠拢,将计算任务放到存储数据的各个节点上去。并行的对整个大数据集进行计算,最后汇总成一个结果。

1.3.什么是MapReduce?

上面描述的过程要做的工作还是很多的,管理并行的计算任务,将任务分发到各个节点上去,最后还要汇总结果,手动编码实现整个管理过程的话还是很复杂的。mapreduce作为一个并行编程框架,帮我们屏蔽掉了这一系列实现细节,让开发人员可以借助API专注的进行计算逻辑的编写。

mapreduce分为两阶段:map、reduce。

map阶段会将计算任务分发到各个数据存储节点上去跑任务,实现对大数据集的并发处理。

reduce阶段会汇总map阶段各节点上计算任务算出来的结果,聚合成最终的结果。

上述过程不难发现,mapreduce就是个主从架构的:

master节点负责总的调度、slave节点负责具体跑任务。

  • master:集群内有一个master服务器、也是作业追踪器JobTracker、负责整个作业的调度和处理。

  • slave:集群内有多个slave服务器,也是执行具体任务的TaskTracker、负责完成具体的任务。

以一个分词统计的mapreduce为例:

2.架构

Client端将任务发给JobTracker,JobTracker负责监控Job的健康状况,控制TaskTracker。JobTracker通过心跳的方式和各个TaskTracker保持联络,TaskTracker将自身的资源使用情况、任务执行进度等信息告知JobTracker。Task Scheduler负责任务的分发规则,决定最终将任务分发给谁。

TaskTracker如何衡量自身的资源使用情况?

tasktracker会将自身所在的机器的内存、CPU等资源视为一个整体,然后将其划分为一份份的slot,根据执行job需要的资源的不同,分为两种slot,map的slot和reduce的slot。taskTracker上报的资源使用情况就是自身两类slot的使用情况。

task分为两种:map task、reduce task,对应着各自执行的是map函数、reduce函数。

3.工作流程

以下是大致过程:

由于大数据集在存储的时候是分片开来,分布式存储的,所以对于map而言,输入就是数据分片。

注意1:

mapreduce处理的并不一定是单个数据,很可能处理的是整个大数据集,所以mapreduce面对的文件的分片数是不固定的,毕竟每一份文件的大小都不一样,分片数肯定不一样。所以map和分片之间不是一一对应的关系,不是说当前处理的文件有多少个分片就有多少个map,上面只是一个逻辑过程,后面会说map和分片的关系。

注意2:

map和reduce不一定是在一台机器上完成的。如果数据分片所在的服务器是台tasktracker并且有map solt可用,那么map肯定是在那台机器上完成的。如果那台机器不是台tasktracker或者没有map solt可用,那么会选择离那台机器最近的满足可做map任务的机器来处理map任务。也就是说一般map是和数据集呆在一起的(隔得近我们也可理解为趋近于本地),但是reduce可能是被分配到其它机器上完成的,因为reduce阶段需要传输的数据量已经不大了,输入只是个中间结果而已,这时候距离不是问题,效率是核心,谁算的快(reduce slot多)谁来。

以下是详细过程:

  • 将文件读出来

  • 将文件切割一下(split)

  • map运算(该有几个map任务?)

  • 算出中间结果(shuffle)

  • reduce运算

  • 算出最终结果

该有几个map任务?map和分片的数量是一致的吗?map和分片之间是一一对应的吗?

答案是:不是。

开多少map是不固定的,取决于有多少资源(map solt),所以才有了split这一步,split这一步会将数据进行切分,切出来的再交给各个map。每个map只专注于处理自己的要负责的split,这也避免了并发带来的数据安全问题。

4.shuffle

有没有发现mapreduce,map其实很简单,reduce也很简单,但是这个算出中间结果(shuffle)这一步有点绕。接下来我们详细拆解map和reduce和过程看看它是如何完成shuffle的。

4.1.map过程

以下展示的仅仅是一个map过程:

HDFS中的数据集输入,为了加速,对输入数据split,分为多个map来并发处理,一个map一个split。处理结果存在缓存中,溢写到磁盘上。溢写的时候进行分区、排序、合并,其中合并很重要:

合并:

4.2.reduce过程

一个reduce接收的输入是来自多个map的,所以首先是将多个map传过来的结果归并起,再交给reduce来使用。下面是完整过程:

假设来自多个map的数据合起来的数据集是:

先进行排序:

进行归并:

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

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

相关文章

特征提取与深度神经网络DNN

OpenCV中的深度神经网络(DNN)模块,现在已经支持图像风格迁移、图像分类、对象检测、语义分割、实例分割、图像变换等。 只支持推理,不支持训练 支持主流的深度学习框架生成模型 推荐使用pytorch/onnx/tensorflow ResNet18的图像…

无代码无国界:我们正在走向软件安全的狂野西部吗?

我们使用的几乎所有东西都是基于代码构建的,从汽车到智能冰箱再到门铃。在企业中,无数的应用程序保持设备、工作流程和操作的运行。因此,当早期的无代码开发平台于 2010 年推出时,承诺为公民开发人员提供更易于访问的应用程序开发…

Redis加入系统服务,开机自启

vi /etc/systemd/system/redis.service i [Unit] Descriptionredis-server Afternetwork.target [Service] Typeforking #使用(/usr/local/bin/redis-server)运行(/usr/local/src/redis-6.2.6/redis.conf) ExecStart/usr/local/…

解决GitHub提交后不显示自己的头像 显示另一个没见过的账号?

问题说明 最近换了几台电脑开发项目,提交到github,看了下提交记录,怎么冒出来不是我的账号头像? 什么鬼i 原因分析 github是按照你注册时候填的邮箱来查找账号,并显示在提交记录上面的。如果账号找不到头像就出不来…

【Day3:JAVA运算符、方法的介绍】

目录 1、运算符1.1 赋值运算符1.2 比较运算符1.3 逻辑运算符1.3.1 逻辑运算符概述1.3.2 逻辑运算符分类1.3.3 短路的逻辑运算符 1.4 三元运算符1.5 运算符优先级 2、方法2.1 方法介绍2.2 方法的定义和调用格式2.2.1 方法的调用2.2.2 带参数方法的调用2.2.3 带返回值方法的调用2…

java如何处理大文件

Java中处理大文件时,通常需要采取一些特定的策略来避免内存溢出或性能问题。以下是一些处理大文件的建议: 使用流(Streams): 使用InputStream和OutputStream的派生类(如FileInputStream, BufferedInputStr…

具身智能论文(四)

目录 1. Alexa Arena: A User-Centric Interactive Platform for Embodied AI2. EDGI: Equivariant Diffusion for Planning with Embodied Agents3. Efficient Policy Adaptation with Contrastive Prompt Ensemble for Embodied Agents4. Egocentric Planning for Scalable E…

OceanBase集群如何进行OCP的替换

有OceanBase社区版的用户提出替换 OCP 管控平台的需求。举例来说,之前的OCP平台采用单节点,然而随着OceanBase集群的陆续上线和数量的不断增多,担心单节点的OCP可能面临故障风险,而丧失对OceanBase集群的管控能力。另此外&#xf…

掌握核心概念:Java高级面试难题精解(二)

Java 高级面试问题及答案 问题 1 **问题:**在Java中,HashMap和Hashtable有什么区别? 答案: HashMap和Hashtable都是实现了Map接口的类,用于存储键值对映射。主要区别在于: 线程安全性:Hasht…

so-vits-svc:AI翻唱,语音克隆

前言 这个项目是为了让开发者最喜欢的动画角色唱歌而开发的,任何涉及真人的东西都与开发者的意图背道而驰。 项目地址:https://github.com/svc-develop-team/so-vits-svc/blob/4.1-Stable/README_zh_CN.md 安装 可以自行配置,应该也不难 …

夯实spring(二十三): 父子容器

本文要点: 什么是父子容器为什么需要用父子容器父子容器如何使用 先来一个案例 系统中有2个模块:module1和module2,两个模块是独立开发的,module2会使用到module1中的一些类,module1会将自己打包为jar提供给module2…

Java05基础 数组

Java05数组 一、数组 数组指的是一种容器,可以用来存储同种数据类型的多个值。 1、数组的静态初始化 初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程 1.1 数组定义格式 //格式一 数据类型[] 数组名 …

linux tar 压缩文件 排除对应的目录 exclude

有时候需要压缩多个目录,其中 有的目录中携带uploads 目录 如web里面有个uploads目录,我想要屏蔽掉 使用exclude 屏蔽目录 命令如下: tar -czvf archive.tar.gz --excludeweb/uploads/* --excludelogs/ web/ web1/* 错误的命令: tar -czvf archive.tar.gz --exclud…

rush 功能特性梳理

Rush 可以让 JavaScript 开发者更轻松地同时构建、发布多个 NPM 包,即将多个包或项目放到一个大仓库下管理。 仅需一次 NPM 安装 仅需一步,Rush 便可以将你项目的所有依赖安装到一个公共文件夹下,该文件夹并不像 “package.json” 一样位于项…

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

Tomcat闪退

Tomcat闪退可能由多种原因引起,包括内存不足、程序异常、端口冲突、配置文件错误、版本不兼容、硬件故障等。以下是一些解决Tomcat闪退问题的常见方法: 检查内存:Tomcat运行需要大量的内存资源。如果服务器内存不足,可以尝试增加…

企业大模型如何成为自己数据的“百科全书”?

作者 | 郭炜 编辑 | Debra Chen 在当今的商业环境中,大数据的管理和应用已经成为企业决策和运营的核心组成部分。然而,随着数据量的爆炸性增长,如何有效利用这些数据成为了一个普遍的挑战。 本文将探讨大数据架构、大模型的集成&#xff0…

text-align、align-items 和 justify-content

当我们使用 CSS 来控制布局时&#xff0c;我们可以采用一些通用的属性来控制文本、元素等在页面上的位置和对齐方式。下面是关于 text-align、align-items 和 justify-content 的通用总结 text-align&#xff1a; 适用范围&#xff1a; 适用于文本元素&#xff0c;如 <p>…

Win10安装mamba个人总结的2种实现方式

强烈推荐大家参考这篇文章&#xff0c;讲述的完整且全面。 Mamba 环境安装踩坑问题汇总及解决方法_error: could not build wheels for causal-conv1d, w-CSDN博客 我的环境是win10&#xff0c;Pycharm2019&#xff0c;miniconda&#xff0c;Python 3.10.14&#xff0c;cuda …

c语言指针学习:交换变量值1

交换地址和交换指针 //交换pt_x和pt_y所指向的地址int *temp;temp pt_x; pt_x pt_y; pt_y temp; //交换pt_x和pt_y的值int temp;temp *pt_x; *pt_x *pt_y; *pt_y temp; 假如没有指针p int i1; p&i; //p指的是所指向变量的地址 即 i的地址 //*p指的是指针所指…