MapReduce思想的学习

2023-11-04

       这学期教hadoop,发现在备课MapReduce思想的时候,查阅资料基本上所有博客都没有真正讲出MapReduce的思想,而只是把它的计算过程讲出来,甚至有些说法还是误人子弟的。所以我就一直在想如何能把MapReduce的思想讲得通俗易懂,发现确实很难能“讲”出来。好久没写文章,希望这篇博客能通过一些细节让大家感受这种处理方式的精华在哪。

       还是从主要能查阅的资料说起。其中我认为最接近讲到思想的两篇文章,第一篇是百科,里面确实囊括了各种说法,中间MapReduce的由来那段文字。它引述谷歌自己的说法: MapReduce的灵感来源于函数式语言(比如Lisp)中的内置函数map和reduce。然后"解释"了map和reduce这两个函数式编程方式和MapReduce框架是怎么关联起来的。读完你会发现,那个解释只是一种反向找到合理的解释而已,并没有正向解释是如何从map和reduce产生这种MapReduce,这才是MapReduce真正的思想。而真正的思想也只有谷歌自己轻描淡写了一下:因为谷歌团队里存在大量同类型的计算需求然后将它提取成框架。其实很多理论尤其是工程的都是从实践中沉淀下的精华中升华出来的,如果我们能体会他们发明MapReduce的过程,对我们自己的实践也极为有益。

       那如何描述MapReduce与map+reduce的关系,那就从wordcount说起吧,谷歌把它当作MapReduce的helloworld,虽然确实是个最现实的例子,但其实并不是最合适解释MapReduce的例子。最合适的例子我觉得是 第二篇博客 https://cloud.tencent.com/developer/news/52756  前面部分举得数扑克牌的例子:给你一叠扑克牌,你想数出每种花色各多少张。这个过程你自己完成也多半会分成两个步骤,首先把牌按花色分堆,然后每堆单独花色的牌数张数,这正是map和reduce的过程。

      1. map是什么意思? 映射函数(map)就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作(例如,map(f(x), [x1, x2, x3, x4] ) = [f(x1), f(x2), f(x3), f(x4)])。例子里第一步的 牌分4堆,就是对每张牌挑出它的花色,放进对应的堆里。

      2. reduce是什么意思?归约函数(reduce)指的是对一个列表的所有元素进行以一种"将上次结果和序列的下一个元素"进行计算的 操作(例如,reduce(f(x,y),  [x1,x2,x3,x4], init) =  f(x4, f(x3, f(x2, f(x1, init))))) init是初始值。例子里第二步的数牌,就是个不断累加的归约操作。

       所以要完成整个数牌任务,map和reduce之间靠的是“花色”这个概念连接,这也是整个问题核心。也就是我们想要用MapReduce来解决问题,也就是找到把map+reduce真正串联起来的这个概念,也就是key。 于是我们就有所有博客都会介绍的MapReduce流程。1. map的作用是,对所有数据的每条应用同一套逻辑:处理/标记出信息的key ;2. 由MapReduce框架帮你把那些相同key的数据整合在一起成为一个一个的 ; 3. reduce的作用是,对同一组的所有数据用一套逻辑,累积出这个组的结果。不失一般性,数据都能表示成<key, value>格式, 那么MapReduce计算过程就可以描述为

                    <k1,v1>   =>  map  =>  <k2, v2>   => shuffle =>  <k2, list<v2>>   => reduce  =>   <k4, v4>

其实可以发现其中map和reduce的计算过程都是可以并行的,shuffle是框架来完成的。也就是下图中map()和reduce()都可以同时进行的。



       那么为什么我说wordcount不是最合适的例子呢?这就要再思考一下Hadoop的MapReduce和真正map+reduce成的MapReduce有什么差异。wordcount中或者Hadoop版我们写的MR 其实是比严格的MapReduce逻辑要宽松的,这里还是有两点:1. map所用函数f,可以产生任意多的<key value> 对,2. reduce所用函数f,为了达到累积效果,可以灵活操作组内所有数据。第一点,wordcount的map操作严格说来,每条数据产生了一组<key,value>数据,这一组数据在我们看来是需要“拉平”的,准确的应该是flatMap,那flatMap和map的区别那就不是一两句话能说清了,大家可自行搜索,背后是有数学差异的,我们的MapReduce允许你实现超越原始map的能力。第二点,让你实现的reduce也不必每次计算都严格地按将上次结果和序列的下一个元素累积这么算,可以抽出列表自己玩,所以说Hadoop的MapReduce还是宽松不少。

       最后MapReduce作为一种分布式计算框架,其的精华何在呢?还是对比一下数牌的例子,如果不是自己一个人竖排,而是给你4个人做这件事,你会怎么做? 直观的办法就是每个人各取一部分扑克牌,数完四种花色,最后再汇集一次。另一种办法,每个人开始也是取一部分扑克牌,但过程是:根据花色不同牌递给不同的人(每个人收一种花色),当每个人挑完花色并收完所有别人给的牌以后,再数自己手里拿到的张数。仔细体会这两种办法的差别,第一种只是简单的任务拆分,看起来也有累加,但工序上并没有真正拆开(很多公司干活的人海战术法),而第二种,是真正的分工模式,同样是任务分配出去了,第二种才是MapReduce。所以MapReduce的精华我认为在于一种它是一种真正代表“分工”的方法论,我认同有人说MapReduce是分布式计算最伟大的发现。另外一个代表MapReduce思想的问题是:一切计算都能用MapReduce来表示。很遗憾我自己也没有找到证明,希望有人能告诉我。

      MapReduce作为一个有十多年历史的方法论,而现在也很少有人需要直接用它来编写算法,都是直接在更高级的算子上编程,比如hive、pig、spark。MapReduce过程理解起来并不难,但它是提供了一种更底层的数据处理思维,这对我们学习大数据十分有用。尤其是spark,你会发现它主打的DAG只是在MapReduce上进行了加强而已。MapReduce作为一种方法论,也不是万能的,不是所有任务都这么合适拆。我们学习MapReduce,就是要学到用它特定的分工策略用来解决某些实际问题的能力。最后回应我开篇说有些文章误人子弟说MapReduce采用的是“分而治之”的策略,其实是瞎说,“分治”是算法里面的概念跟这里的“分工”没有一丁点关系。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MapReduce思想的学习 的相关文章

  • Hadoop 框架中使用的属性的完整列表

    我正在对 Hadoop 框架进行一些研究 我想问一下框架中可以使用的属性 例如 io sort mb io sort record percent etc 我可以参考这个框架的整个属性列表吗 非常希望有人能帮助我 另外 我想问一下 io s
  • 使用 Hadoop,我可以在未运行数据节点的计算机上创建任务跟踪器吗?

    所以这是我的情况 我有一个使用 HBase 的 MapReduce 作业 我的映射器接受一行文本输入并更新 HBase 我没有减速器 并且我没有将任何输出写入光盘 我希望能够在预期利用率激增时向集群添加更多处理能力 然后在利用率下降时缩减处
  • 解析数百万个小 XML 文件

    我有 1000 万个小 XML 文件 300KB 500KB 我在 Mapreduce 中使用 Mahaout 的 XML 输入格式来读取数据 并使用 SAX 解析器进行解析 但处理速度非常慢 使用输入文件的压缩 lzo 有助于提高性能吗
  • 在couchbase中编写reduce函数

    这是我第一次尝试沙发基地 我的 json 文档如下所示 member id 12345 devices device id 1 hashes h1 h2 h3 h4 device id 2 hashes h1 h2
  • Spark:按元组/列中的多个值对 RDD 进行排序

    所以我有一个RDD如下 RDD String Int String 举个例子 b 1 a a 1 b a 0 b a 0 a 最终结果应该类似于 a 0 a a 0 b a 1 b b 1 a 我该怎么做这样的事情 尝试这个 rdd sor
  • 如何在有或没有 Pig 的情况下使用 Cassandra 的 Map Reduce?

    有人可以解释 MapReduce 如何与 Cassandra 6 配合使用吗 我已经阅读了字数统计示例 但我不太明白 Cassandra 端与 客户端 端发生的情况 https svn apache org repos asf cassan
  • 如何在 couchdb 中索引多维数组

    我有一个多维数组 我想用 CouchDB 对其进行索引 实际上使用 Cloudant 我的用户有他们所属团队的列表 我想搜索找到该团队的每个成员 因此 获取所有具有 ID 为 79d25d41d991890350af672e0b76faed
  • Apache Pig:无法运行我自己的pig.jar 和pig-withouthadoop.jar

    我有一个运行 Hadoop 0 20 2 和 Pig 0 10 的集群 我有兴趣向 Pig 的源代码添加一些日志 并在集群上运行我自己的 Pig 版本 我做了什么 使用 ant 命令构建项目 有pig jar和pig without had
  • 如何用hadoop实现自连接/叉积?

    对成对的项目进行评估是常见的任务 示例 重复数据删除 协同过滤 相似项目等 这基本上是具有相同数据源的自连接或叉积 要进行自连接 您可以遵循 减少端连接 模式 映射器将连接 外键作为键发出 将记录作为值发出 因此 假设我们想要对以下数据的
  • 在 Hadoop 作业中找不到类

    我有一个地图缩减作业 它从 DocumentDB 获取输入 我已将 jar 文件添加到源代码中的 lib 目录下 并在运行作业时使用 libjars 但我仍然收到 jar 文件中的类未找到类错误 这是我的驱动程序的一部分 public cl
  • Hadoop MapReduce 提供嵌套目录作为作业输入

    我正在从事一项处理嵌套目录结构的工作 其中包含多个级别的文件 one three four baz txt bleh txt foo txt two bar txt gaa txt 当我添加one 作为输入路径 不会处理任何文件 因为没有文
  • 仅使用一个映射器的 Hadoop gzip 输入文件[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 hadoop 不能分割一个大文本文件 然后使用 gzip 压缩分割的内容 https stackoverflow com questions 6511255 why cant hadoop s
  • 如何具体确定MRJob中每个map步骤的输入?

    我正在从事一项地图缩减工作 包含多个步骤 使用 mrjob 每个步骤都会接收上一步的输出 问题是我不想这样 我想要的是提取一些信息并在第二步中针对所有输入等使用它 可以使用 mrjob 来做到这一点吗 Note 因为我不想使用emr 这个问
  • FAILED 错误:java.io.IOException:所有收集器的初始化失败

    我在运行 MapReduce WordCount 作业时遇到一些错误 错误 java io IOException 所有收集器的初始化 失败的 最后一个收集器中的错误是 class wordcount wordmapper at org a
  • CouchDB“加入”两个文档

    我有两个看起来有点像这样的文档 Doc id AAA creator id data DataKey id credits left 500 times used 0 data id AAA 我想要做的是创建一个视图 它允许我传递 Data
  • 如何处理 YARN MapReduce 作业的容器故障?

    YARN 中如何处理软件 硬件故障 具体来说 如果容器发生故障 崩溃 会发生什么 容器和任务失败由节点管理器处理 当容器失败或死亡时 节点管理器会检测到失败事件并启动一个新容器来替换失败的容器并在新容器中重新启动任务执行 如果应用程序主机发
  • Hadoop YARN 作业陷入映射 0% 并减少 0%

    我正在尝试运行一个非常简单的作业来测试我的 hadoop 设置 所以我尝试使用 Word Count Example 它陷入了 0 所以我尝试了一些其他简单的作业 并且每个作业都陷入了困境 52191 0003 14 07 14 23 55
  • mongodb 聚合随机化(shuffle)结果

    我正在浏览一堆 mongo 文档 但找不到洗牌或随机化结果内容的可能性 有没有 特别是对于聚合框架本身来说 实际上并没有任何本地方法 因为还没有可用的运算符来执行诸如生成随机数之类的操作 因此 无论您可能投射一个字段进行排序的任何匹配 都不
  • 使用 Hadoop 映射两个数据集

    假设我有两个键值数据集 数据集A和B 我们称它们为数据集A和B 我想用 B 组的数据更新 A 组中的所有数据 其中两者在键上匹配 因为我要处理如此大量的数据 所以我使用 Hadoop 进行 MapReduce 我担心的是 为了在 A 和 B
  • 在映射器的单个输出上运行多个减速器

    我正在使用地图缩减实现左连接功能 左侧有大约 6 亿条记录 右侧有大约 2300 万条记录 在映射器中 我使用左连接条件中使用的列来创建键 并将键值输出从映射器传递到减速器 我遇到性能问题 因为两个表中的值数量都很高的映射器键很少 例如分别

随机推荐

  • 【前端性能】常见前端性能优化

    常见性能优化 前言 一 图片优化 1 雪碧图 图片精灵 2 图片压缩 3 字体图标代替图片 4 webp图片 二 DOM优化 1 缓存DOM节点查找的结果 2 防抖和节流 3 事件代理 4 减少合并DOM操作 5 DOM读写分离 6 DOM
  • VMware虚拟机扩容——Ubuntu的/dev/sda1分区挂在根目录(“/“)下用LVM(逻辑卷管理)模式扩容无效

    一 问题描述 在VMware虚拟机装了Ubuntu18 04 一开始分配的内存是20多个G 如下图 用了一段时间后发现不够用了 需要扩容 然后上网查了一下虚拟机扩容的方法 但是大多数教程的情况是 根目录 挂在类似 dev xxx xxxro
  • ThinkpadE480 win10改win7

    Thinkpad E480win10改win7 电脑配置信息 i7 8550u 直接进PE 一键装机 选择win7镜像安装到系统盘 安装后进系统失败 没有修改bios信息 win10系统改win7设置bios方法图文教程 一起来围观吧 ht
  • Vue3导出excel,使用js-table2excel

    装依赖 npm install js table2excel vue中引入 import table2excel from js table2excel 使用 const column title sn key sn type text t
  • Mysql命令及增删改查操作

    测试工程师的目的是找出软件的不足 并告诉开发工程师 出现问题的环境 操作步骤和输入输出数据 优秀的测试工程师 需要告诉开发团队 软件的不足 这类不足会导致什么情况 如何避免 以及如何去修改 这是为什么高级软件测试工程师比开发工程师工资高的原
  • Qt应用开发(基础篇)——组合框容器 QGroupBox

    一 前言 QGroupBox继承于QWidget 是一个带有标题的组合框架容器控件 QGroupBox组合框容器自带一个顶部标题 一个面板 面板内部展示各种各样的部件 标题用来解释这些部件为什么集合在一起 并且支持键盘快捷方式切换部件焦点
  • c++读文件(一次全读/每行读/多次读)

    我以为这些都很容易在网上找到 谁知网上乱七八糟的东西太多 让我找了很久 开发环境为Windows VS2013 一次全读 std ifstream t path 读文件ifstream 写文件ofstream 可读可写fstream std
  • 开源IOT——一个最小的物联网系统设计方案及源码

    或许这个可以当成是你的毕业设计又或者你可以用它来控制你想控制的东西 总之你可以用它来做一个最小的物联网系统 不过 在这里可能没有那么复杂的功能 因为强调的是最小 BareMinimum 这也是为什么我没有改Arduino上面的工程名的原因
  • [附源码]计算机毕业设计校园疫情管理系统Springboot程序

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • SpringMVC SpringBoot Get请求接收复杂参数

    前沿 对于复杂的接口请求 一般都用POST JSON数据的方式 后端用 RequestBody接收 但是对于某些有洁癖的人或者想严格遵循类Restful风格的人来讲 查询数据就是想用GET 怎么实现呢 Request Data public
  • can总线的示波器检测方法

    整理自网络 stm32的can总线是在APB1上的 stm32f10x的主频是72Mhz can外设时钟是36Mhz stm32f2xx的主频是120Mhz can外设时钟是30Mhz STM32 APB1和APB2区别 APB2负责AD
  • Linux统计某文件夹下文件、文件夹的个数

    http blog sina com cn s blog 464f6dba01012vwv html 统计某文件夹下文件的个数 ls l grep wc l 统计某文件夹下目录的个数 ls l grep wc l 统计文件夹下文件的个数 包
  • 瞧瞧,这样的「函数」才叫 Pythonic

    在机器学习中 我们经常需要使用类和函数定义模型的各个部分 例如定义读取数据的函数 预处理数据的函数 模型架构和训练过程的函数等等 那么什么样的函数才是漂亮的 赏心悦目的代码呢 本期教程 会从命名到代码量等六方面探讨如何养成美妙的函数 文末有
  • Python之序列

    序列是一种数据存储方式 用来存储一系列的数据 在内存中 序列就是一块用来存放多个值的连续空间 比如一个整数序列 10 20 30 40 可以这样表示 由于Python3中一切皆对象 在内存中实际是按照如下方式储存的 a 10 20 30 4
  • windows自带虚拟机无法正确安装软件 解决方案

    使用的虚拟机版本Ubuntu 20 04 4 LTS 错误描述 ruby DESKTOP LP8NQUK tmp test sudo apt install imagemagic 6 q16 sudo password for ruby R
  • Linux如何用ftp传输文件【ftp命令】

    Linux如何用ftp传输文件 ftp命令 Windows Linux 带端口的ftp命令 使用 FTP 下载文件 使用 FTP 上传文件 关闭FTP连接 Windows 在Windows系统中 可以用可视化的ftp来传输文件 或者下在文件
  • 第二章:25+ Python 数据操作教程(第八节如何从 PANDAS DATAFRAME 中删除一列或多列)

    在本教程中 我们将介绍如何从 pandas 数据框中删除或删除一个或多个列 是一个用于数据操作的 python 包 它具有以下数据任务的几个功能 目录 在 python 中删除一列 在 Python 中删除多列 如何从 pandas Dat
  • tp5 使用_initialize做验证时验证失败不能直接返回数据和打断程序运行

    在项目开发时写了一个基类 让其他控制器都继承这个类 当访问控制器时基类某些验证时 直接截断返回错误不执行控制器中的解决办法 失败写法 return json encode data 正确写法 echo json encode data ex
  • 利用XSS获取cookie

    如果web应用在用户输入的地方没有过滤特殊字符 比如 lt gt
  • MapReduce思想的学习

    这学期教hadoop 发现在备课MapReduce思想的时候 查阅资料基本上所有博客都没有真正讲出MapReduce的思想 而只是把它的计算过程讲出来 甚至有些说法还是误人子弟的 所以我就一直在想如何能把MapReduce的思想讲得通俗易懂