MapReduce原理简介

MapReduce 是一种用于处理大规模数据集的编程模型和计算框架,最初由 Google 提出,并被 Hadoop 等开源项目广泛应用。它主要包括两个阶段:Map 阶段和 Reduce 阶段。下面是 MapReduce 的基本原理:

图示不错

MapReduce 的基本原理:

  1. Map 阶段(Map Phase)

    • 输入数据被分割成大小相等的数据块,然后由多个 Map 任务并行处理。
    • 每个 Map 任务接收一部分数据块,并将其转换成键-值对(Key-Value pairs)的集合。
    • 用户定义的 Map 函数(mapper)被应用于每个键-值对,生成新的键-值对列表。
    • Map 函数的输出会根据键的哈希值被分发到多个 Reduce 任务中,以便后续的 Reduce 阶段处理。
  2. Shuffle 阶段(Sort and Shuffle)

    • 在 Map 阶段之后,所有 Map 任务的输出会被分区并按照键的哈希值进行排序。
    • 相同键的值被分配到相同的 Reduce 任务中,以便后续的 Reduce 阶段处理。
  3. Reduce 阶段(Reduce Phase)

    • 每个 Reduce 任务接收来自多个 Map 任务的输出,即经过分区和排序后的键-值对集合。
    • 用户定义的 Reduce 函数(reducer)被应用于每个键-值对列表,生成最终的输出结果。

在这里插入图片描述
以上过程分步骤描述一下:

  1. 创建 Split。由于 Map 任务最终是分布式的进程运行在不同的机器上,split 描述了每个 Map 任务该去哪台机器上的整块数据中,读取哪一部分的数据;
  2. 读取数据;
  3. 数据经过用户编写的 Map 业务处理,输入的是 Key-Value 格式,输出也是 Key-Value 格式。这一步其实是对数据标记的过程,为每条数据标记一个特征(key),相同特征的数据最终会到一起;
  4. 数据经过分区后,写入到内存缓冲区中;
  5. 内存缓冲区被写满 80%后,在内存中进行排序(先按照分区排序,每个分区内部按照 key 排序)
  6. 如果定义了 combiner 的话,进行一次合并
  7. 每个 Map 溢写出一个文件出来;
  8. 最终对每个 Map 溢写出的文件合并成一个大文件;
  9. 进行一次 combine,写入到本地文件中;
  10. 进行到 reduce 阶段,每个 reduce 任务从上游数据中拷贝出属于自己的文件
  11. 调用用户定义的 reduce 方法进行计算
  12. 最终结果写入到 hdfs 中

在这里插入图片描述

  • 这个 Map 任务计算之后,经过一个 partition 分区器,不同的 key 分配到不同的分区中。分区数量由下游的 reduce 数来决定。
  • 经过分区后的数据,进入到一个环形缓冲区中,并且多次溢写之后,生成小文件。每个 Map Task 最终合并成一个文件。
  • 可以看到 merge 最后的一个文件中是分段的,第一段的数据是给下游的第一个reduce任务的,第二段的数据是给下游的第二个 reduce 的。
  • 也就是下游的 每个 reduce 要来上游的每个 Map 任务的文件中,取到属于自己的那一段文件
  • reduce 任务拉取完上游的各个分段数据之后,进行一次合并,合并到同一个文件中
  • reduceTask 读取这个合并好的文件,把相同的key分组一次,进行计算即可

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

word count的例子

博客例子图示

  • 并行读取文本中的内容,然后进行MapReduce操作

在这里插入图片描述

  • Map过程:并行读取文本,对读取的单词进行map操作,每个词都以<key,value>形式生成。
  • 我的理解:
    一个有三行文本的文件进行MapReduce操作。
  • 读取第一行Hello World Bye World ,分割单词形成Map。
    <Hello,1> <World,1> <Bye,1> <World,1>
  • 读取第二行Hello Hadoop Bye Hadoop ,分割单词形成Map。
    <Hello,1> <Hadoop,1> <Bye,1> <Hadoop,1>
  • 读取第三行Bye Hadoop Hello Hadoop,分割单词形成Map。
    <Bye,1> <Hadoop,1> <Hello,1> <Hadoop,1>
    在这里插入图片描述
  • Reduce操作是对map的结果进行排序,合并,最后得出词频。
  • 我的理解:
  • 经过进一步处理(combiner),将形成的Map根据相同的key组合成value数组。
    <Bye,1,1,1> <Hadoop,1,1,1,1> <Hello,1,1,1> <World,1,1>
  • 循环执行Reduce(K,V[]),分别统计每个单词出现的次数。
    <Bye,3> <Hadoop,4> <Hello,3> <World,2>
    在这里插入图片描述

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

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

相关文章

Java的Future机制详解

Java的Future机制详解 一、为什么出现Future机制二、Future的相关类图2.1 Future 接口2.2 FutureTask 类 三、FutureTask的使用方法四、FutureTask源码分析4.1 state字段4.2 其他变量4.4 构造函数4.5 run方法及其他 一、为什么出现Future机制 常见的两种创建线程的方式。一种是…

开源模型应用落地-chatglm3-6b-gradio-入门篇(七)

一、前言 早前的文章&#xff0c;我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在&#xff0c;我们可以通过使用gradio&#xff0c;通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦&#xff0c; 让我们更方便地体验模型的效果。 二、术语 2.…

《剑指 Offer》专项突破版 - 面试题 110 : 所有路径(C++ 实现)

题目链接&#xff1a;所有路径 题目&#xff1a; 一个有向无环图由 n 个节点&#xff08;标号从 0 到 n - 1&#xff0c;n > 2&#xff09;组成&#xff0c;请找出从节点 0 到节点 n - 1 的所有路径。图用一个数组 graph 表示&#xff0c;数组的 graph[i] 包含所有从节点 …

组件与组件之间的传递-事件总线

两个组件之间的数据传递&#xff08;属于非父子组件通讯&#xff09; 当项目中只是两个组件的少量数据传递时使用事件总线这种方法会比较方便&#xff0c;但当遇到大量数据传递时推荐使用vuex 思路 组件与组件之间不能直接传递&#xff0c;这是候可以创建一个EventBus.js文件…

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务&#xff0c;它提供了一项基本服务&#xff1a;分布式锁服务。分布式应用可以基于它实现更高级的服务&#xff0c;实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…

力扣:49. 字母异位词分组

知识点&#xff1a; 散列函数 散列函数能使对一个数据序列的访问过程更加迅速有效&#xff0c;通过散列函数&#xff0c;数据元素将被更快地定位&#xff1a; 1. 直接寻址法&#xff1a;取关键字或关键字的某个线性函数值为散列地址。即H&#xff08;key&#xff09;key或H&a…

计算机网络 Cisco路由器基本配置

一、实验内容 1、按照下表配置好PC机IP地址和路由器端口IP地址 2、配置好路由器特权密文密码“abcd&#xff0b;两位班内序号”和远程登录密码“star” 3、验证测试 a.验证各个接口的IP地址是否正确配置和开启 b.PC1 和 PC2 互ping c.验证PC1通过远程登陆到路由器上&#…

C#医学实验室/检验信息管理系统(LIS系统)源码

目录 检验系统的总体目标 LIS主要包括以下功能&#xff1a; LIS是集&#xff1a;申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的信息管理系统。LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保存检验信息的工具&a…

初级软件测试常见问题

1.JMeter &#xff08;1&#xff09;在http请求的时候&#xff0c;消息体数据中的数据需要用{}和“”标记起来&#xff0c;变量要用${}括起来。 &#xff08;2&#xff09;在响应断言的时候&#xff0c;要根据测试模式输出的内容来改变测试字段&#xff0c;假如输出错误可以把…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件&#xff0c;点击“继续” 初始文件安装完成后选择我们需要安装的项&#xff0c;并勾选好必要的单个组件&#xff0c;设…

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

Emacs之实现复制当前已打开文件buffer(一百三十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Day55 动态规划 part15

Day55 动态规划 part15 392.判断子序列 我的思路&#xff1a; 自己还是只能想到双指针法 解答: class Solution {public boolean isSubsequence(String s, String t) {if(s.length() 0) {return true;}if(s.length() > t.length() || t.length() 0) {return false;}ch…

(九)C++自制植物大战僵尸游戏自定义对话框的实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 对话框在游戏的交互中非常重要。在游戏中&#xff0c;对话框不仅可以提醒用户下达任务指令&#xff0c;而且还可以让用户进行操作&#xff0c;自定义游戏中的各种属性。对话框在游戏的交互中非常常见且大量使用。Co…

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

近日&#xff0c;LigaAI 和极狐GitLab 宣布合作&#xff0c;双方将一起探索 AI 时代的研发效能新范式&#xff0c;提供 AI 赋能的一站式研发效能解决方案&#xff0c;让 AI 成为中国程序员和企业发展的新质生产力。 软件研发是一个涉及人员多、流程多、系统多的复杂工程&#…

[docker] 核心知识 - 概念和运行

[docker] 核心知识 - 概念和运行 之前 docker 学了个开头就去搞项目去了&#xff0c;不过项目也开展了好久了&#xff0c;前端差不多吃透了&#xff0c;有些新功能需要用 docker 和 k8s……是时候重新学习一下了。 这一部分简单的过一下概念和讲一下怎么运行 docker 镜像和启…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址&#xff0c;我下载的下图这个&#xff0c;下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的&#xff0c;真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

janus部署

配置和运行janus 1. 配置nginx 安装nginx&#xff0c;主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll&#xff0c;发现运用了这个大老李&#xff0c;通过添加PATH路径也无法解决&#xff0c;看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项&#xff0c;图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…