上一篇简单讲了一下HDFS,简单来说就是一个叫做“NameNode”的大哥,带着一群叫做“DataNode”的小弟,完成了一坨坨数据的存储,其中大哥负责保存数据的目录,小弟们负责数据的真正存储,而大哥和小弟其实就是一台台的电脑,他们之间通过交换机,互相联系到了一起。

  其实这位大哥和这群小弟不仅能存储数据,还能完成很多计算任务,于是他们有了新的名字,大哥叫做“JobTracker”,而小弟们叫做“TaskTracker”,一起组成了MapReduce。今天就来说说MapReduce是怎么一回事。

  这里仅仅是从大面上去介绍,让大家有一个整体的认识,而整体上认识后,个别的细节知识自己再去看看别的资料,也就很容易理解了,只是时间问题而已。

  刚开始学习MapReduce,肯定会被各种各样的概念整的晕头转向,到底尼玛任务、job、作业、Task有什么区别?split、数据分片、数据块、block到底什么区别?Map、Mapper、Map方法到底是不是一回事?到底Map输入的Key和Value是什么,是一行数据,还是一行行的数据?Reduce的输入到底尼玛是什么东西?他们之间到底是怎么一个数据流程?还出现了什么Sort、Merge、Shuffle?我了个去啊!!!

  如果你也有这样的疑惑,那么下面听我慢慢道来吧,请记住两点:1.MapReduce是个框架,因此是很简单的,前先在脑子里面有这个观念。2.有了这个观念,就不要暴躁了,慢慢看下去吧。

  为了说清MapReduce这个问题,我还是以经典的统计单词数量来一步步的说明。我来一步步的去说:

一、我们要干什么?

  现在有一个文本文件,里面好多好多单词,文件有多大呢?别管它多大了,反正有很多行,我们要做的事情就是:统计出来到底这个文件里面每个单词出现的次数,最终输出结果到文件中。简单来说如下:

  输入:一个有很多单词的文本文件。     

例如:文件为test.txt,文件内容如下:
hello world
hello hadoop
    .
    .
    .
    .
hello dog
hello world
hello jobs

  输出:一个显示单词出现次数的文件。

例如:统计出来结果为:
hello
world
hadoop
jobs
    .
    .
    .
    .

二、编写程序

  针对上面这件事,我们编写程序,程序名字叫MyWordCount,我们把程序提交给MapReduce,让大哥和小弟们去做,我们称之为一个作业,英文名叫做job。

三、程序做了什么

  关键点来了。

1、文件分割

  这么大一个数据文件test.txt,首先输入进来之后,会被分割成一块一块的,称之为一个个split。为了方便我们假设分成了5个split,分别是split1~5,说白了,可以认为是把test.txt分成了五个小文件split1~5,每个split里面有很多行数据。(到底输入文件怎么划分,可以看看InputSplit,可以设置的,这里我们就假设那个test.txt文件内容从上到下分成了5份)。接下来分别对这5个split进行单词的统计,叫做分布式运算。每一个split作为输入数据,给了一个Map,因此叫做Map任务,你也可以叫做Mapper,在编写程序里面Mapper是一个类,用了继承的。

  因此,总结一下就是:一个文件,分成了split1~5五个数据分片,每个数据分片对应一个Map任务,共五个Map任务,分别为Map1~5。那么这5个任务让谁去干呢?大哥“JobTracker”说,小弟“Tasktracker”们去干吧。要是有5个小弟,一人一个Map任务,可是假如有三个小弟的话,那么其中两个小弟就必须多干一个任务。

(实际运行过程中,大概是每个小弟大约10到100个Map,对于CPU消耗较小的,大哥可能会给这个小弟分配300个左右)

2.Map操作

  让我们把镜头拉进其中一个split的Map过程,假设是split1的Map1过程。

  Split1有好多行数据,整体给了Map任务去操作。那么Map任务怎么操作呢?在程序里面其实就是一个Mapper类而已。因此真正实现操作的是Mapper类的其中的map方法来操作,map方法会对输入文件进行操作。那么问题来了,map方法的输入key和value是什么呢,是split1的所有数据还是某一行数据。答案是:某一行数据。那是怎么怎么处理完成那么多行数据的。答案是:运行多次map方法。

因此,总结一下就是:split1有很多行数据,map1任务去处理,对于每一行数据,运行一次map方法。

假如split1有三行:第一行:hello world   第二行:hello hadoop  第三行:hello hadoop。

经过Map1任务运行三次map方法,

第一次map方法的:

输入的key为1,value为:hello world(其中key的值是我瞎编的,value值是对的)。运行map方法里面的代码后

输出为:第一行:hello  1,第二行:world 1

第二次运行map方法的

输入的key为12,value为:hello hadoop,运行map方法后,

输出为:第一行:hello 1,,第二行:hadoop  1

第三次运行map方法

输入的key为23,value为:hello hadoop,运行map方法后,

输出为:第一行:hello 1,hadoop  1

最终,split1,经过一次Map1任务的好多次map方法运行后,最终输出结果可能如下:

hello
world
hello
hadoop
hello
hadoop    

最终,5个split1~5和5个map1~5输出了5份结果,分别存在了不同的节点上,以中间文件存在的,可能并不是知道它们在哪里。

接下来,就该进行Reduce的归并操作,最终统计出来结果,可是在Reduce之前,Map之后,还做了很多事情,下篇再写吧,这篇内容太长了。

(完)

文档信息

换个角度理解云计算之MapReduce的更多相关文章

  1. 换个角度理解云计算之MapReduce(二)

    接上篇 3.Combiner操作 前面讲完Map操作,总结一下就是:一个大文件,分成split1~5,对应于Map1~5,每一个Map处理一个split,每一个split的每一行,会用每一个Map的m ...

  2. 换个角度理解云计算之HDFS

    学习云计算,必然得了解Hadoop,而Hadoop中的HDFS(分布式文件系统)是一个基础,接下来就写一下我所理解的HDFS. 有一个很有特别的村庄,村庄里面有一个很牛逼的人,叫做“大哥”,村民们都信 ...

  3. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...

  4. 理解hadoop的Map-Reduce数据流(data flow)

    http://blog.csdn.net/yclzh0522/article/details/6859778 Map-Reduce的处理过程主要涉及以下四个部分: 客户端Client:用于提交Map- ...

  5. 理解云计算的(IaaS PaaS SaaS)

    本文不经允许,不得转载! 云计算技术已经慢慢普及了.我们做技术的有必要学习云计算技术. IaaS:Infrastructure-as-a-Service(基础设施即服务)云计算到来之前,很多企业都是自 ...

  6. 云计算(5)---MapReduce

    什么是MapReduce 例如用MapReduce如何计算12+22+32+42 用MapReduce执行Wordcount 步骤1:Map map task1 和map task2是独立,并行进行 ...

  7. 深入理解hadoop之mapreduce

    本文系原创,若有转载需要,请注明出处.https://www.cnblogs.com/bigdata-stone/ 1.mapReduce简介 MapReduce是面向大数据并行处理的计算模型.框架和 ...

  8. 深入理解hadoop值MapReduce(2)

    1.MapReduce编程模型概述 MapReduce编程模型给出了分布式的编程方法,总共分为5个步骤.分为这5个步骤的优点:组件化和并行化 (1)迭代.遍历输入数据,并将其解析成key/value键 ...

  9. 理解云计算三种服务模式——IaaS、PaaS和SaaS

    云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类: SaaS(Software as a Service–软件即服务) PaaS(Platform as a Ser ...

随机推荐

  1. int main(int argc,char* argv[])详解

    argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数, 比如:       int   main(int   argc,   ...

  2. 数字与字母 随机数小demo

    public String generateRandomId(){ String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI ...

  3. redis迁移工具-redis-migrate-tool使用测试

    https://github.com/vipshop/redis-migrate-tool一.安装redis-migrate-tool a.下载redis-migrate-tool软件包 https: ...

  4. iOS App打包上架的流程

    一.申请苹果开发者账号 首先需要申请苹果开发者账号才能在APP store 里发布应用. 开发者账号分为:(1)个人开发者账号   (2)企业开发者账号   主要的区别是:点击打开链接 1.个人开发者 ...

  5. 编译器工具 Flex Bison for Windows 简单入门例子

    最近从事一个系统仿真软件的开发,里面定义了自己的描述性语言MSL, MSL语言经FlexBison转换成C语言,然后用C编译器来编译并计算仿真. 现在领域驱动开发比较热门,有机会定义自己的语言对程序员 ...

  6. 浅谈城市规划在移动GIS方面的应用发展

    1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...

  7. Hyper-v虚拟机文件VHDX与VHD的格式转换

    今天遇到一个坑,我在本机(windows 10)上创建的CentOS虚拟机作为docker的宿主机,部署了gitlab等容器,准备迁移到服务器上的时候,发现始终无法导入,提示必须通过Hyper-v导出 ...

  8. zmq中zmq_poll()函数介绍

    功能: 查看指定的多个socket上哪些socket发生了指定的事件, 事件有: ZMQ_POLLIN: 有消息到来 ZMQ_POLLOUT: 当前无阻塞可以发送消息 ZMQ_POLLERR: 只对标 ...

  9. Python学习之路-Day2

    数据类型常用操作 不管是查整数还是查布尔或者是列表...要记住 dir(int)   查看某个类型的功能 help(int) 查看该类型的功能及文档说明 type(4)   查看某个字符或数字的类型- ...

  10. 网页播放器(jsp、js)

    jsp对控件显示 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...