Hadoop开发人员基础课程之初识MapReduce

随着Hadoop在国内的迅速崛起,MapReduce也逐渐引起开发人员的重视,作为Hadoop的核心,让我们一起来看看它是怎样运作的。

一、什么是MapReduce?

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

说着挺抽象,我们来看下图,首先明确MapReduce在Hadoop项目中的位置。

Hadoop实际上就是谷歌三宝的开源实现,Hadoop MapReduce对应Google MapReduce,HBase对应BigTable,HDFS对应GFS。HDFS(或GFS)为上层提供高效的非结构化存储服务,HBase(或BigTable)是提供结构化数据服务的分布式数据库,Hadoop MapReduce(或Google MapReduce)是一种并行计算的编程模型,用于作业调度。

简单概括的说,MapReduce是将一个大作业拆分为多个小作业的框架(大作业和小作业应该本质是一样的,只是规模不同),用户需要做的就是决定拆成多少份,以及定义作业本身。

二、map函数和reduce函数

map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。

map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。

reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

统计词频的MapReduce函数的核心代码非常简短,主要就是实现这两个函数。

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 counts  
    int result = 0;  
    for each v in values:  
        result += ParseInt(v);  
        Emit(AsString(result));

在统计词频的例子里,map函数接受的键是文件名,值是文件的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就是单词w,值是一串"1"(最基本的实现是这样,但可以优化),个数等于键为w的键值对的个数,然后将这些&ldquo;1&rdquo;累加就得到单词w的出现次数。最后这些单词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。

三、MapReduce工作原理

上图是论文里给出的流程图。一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。图中执行的顺序都用数字标记了。

1、MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。

2、user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。

3、被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

4、缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。

5、master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。

6、reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。

7、当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。

所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。

本文参考自Phoenix  转载请注明文章转载自:慧都控件网

时间: 2024-10-11 19:21:43

Hadoop开发人员基础课程之初识MapReduce的相关文章

王家林的云计算分布式大数据Hadoop征服之旅:HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;集群管理

一:课程简介: 作为云计算实现规范和实施标准的Hadoop恰逢其时的应运而生,使用Hadoop用户可以在不了解分布式底层细节的情况下开发出分布式程序,从而可以使用众多廉价的计算设备的集群的威力来高速的运算和存储,而且Hadoop的运算和存储是可靠的.高效,的.可伸缩的,能够使用普通的社区服务器出来PB级别的数据,是分布式大数据处理的存储的理想选择. 本课程会助你深入浅出的掌握Hadoop开发(包括HDFS.MapReduce.HBase.Hive等),并且在此基础上掌握Hadoop集群的配置.维

Hadoop学习笔记—4.初识MapReduce

一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而MapReduce就是一种简化并行计算的编程模型,它使得那些没有多有多少并行计算经验的开发人员也可以开发并行应用程序.这也就是MapReduce的价值所在,通过简化编程模型,降低了开发并行应用的入门门槛. 1.1 MapReduce是什么 Hadoop

Hadoop企业级完整训练:HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;Zookeeper&amp;Pig&amp;Project)

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐进的掌握Hadoop是本课程的核心. 云计算学习者的心声: 如何从企业级开发的角度,不断动手实际操作,循序渐进中掌握Hadoop,直到能够直接进行企业级开始,是困惑很多对云计算感兴趣的朋友的核心问题,本课程正是为解决此问题而生,学习者只需要按照一步步的跟着视频动手操作,即可完全无痛掌握Hadoop企

Cloudera Developer之Spark 及 Hadoop 开发员培训(CCA-175)

学习如何将数据导入到 Apache Hadoop 机群并使用 Spark.Hive.Flume.Sqoop.Impala 及其他 Hadoop 生态系统工具对数据进行各种操作和处理分析. 详情:https://www.huodongjia.com/event-1838227010.html 在为期四天的培训中,学员将学习关键概念和掌握使用最新技术和工具将数据采集到 Hadoop 机群并进行处理.通过学习掌握诸如 Spark.Hive.Flume.Sqoop 和 Impala 这样的 Hadoop

初识MapReduce

MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而MapReduce就是一种简化并行计算的编程模型,它使得那些没有多有多少并行计算经验的开发人员也可以开发并行应用程序.这也就是MapReduce的价值所在,通过简化编程模型,降低了开发并行应用的入门门槛. 1.1 MapReduce是什么 Hadoop MapReduce是一个软件框架,基

hadoop开发环境搭建(1)

作为初学Hadoop的新手,搭建Hadoop开发环境花了我很大功夫.倒不是hadoop搭建复杂,由于hadoop本身是一个分布式.多jvm进程的运行环境,我们想达到能用eclipse进行代码跟踪调试目的,还真不是一般的费劲. 一边在网上向给位前辈学习,一边自己动手尝试,花了我整整一天的时间终于完成了,为了使自己好不太容易完成的成就,后续被轻易忘记,也为了帮助其他hadoop小白同类脱贫致富,花了一晚上总结了此篇博文,以兹鼓励. 一.准备篇 言归正传,首先是准备篇.这里我们需要准备不少东东: 1.

搭建基于MyEclipse的Hadoop开发环境

前面我们已经搭建了一个伪分布模式的Hadoop运行环境. 我们绝大多数都习惯在Eclipse或MyEclipse中做Java开发,本次随笔我就教大家如何搭建一个基于MyEclipse IDE的Hadoop开发环境. 闲话少说,走起! 第一步 安装MyEclipse的Hadoop插件 1 打开MyEclipse,查看是否已经安装过 window  ->  preferences 没有显示Hadoop Map/Reduce,所以说明是MyEclipse是没有安装过Eclipse的插件. 首先,确认你

程序猿菜鸟必备——作为独立开发人员怎样系统的学习编程

接触一个行业,前期最好来一个系统的学习,有完整的框架一点一点的把基础吃透,不能左一耙子,右一锄头.以我的从业经验给大家分享怎样系统的学习编程开发,刚入坑的程序猿菜鸟注意了,迅速占据高地.迅速收藏了. 整体大致分为下面几类: A.教材上的知识 这部分内容来自计算机专业的课程教材.也有可能会涉及一部分来自其它相关专业或者相关课程的内容. B.编程语言 每个程序猿仅仅有在会使用一门语言的情况下才有可能从事开发工作,所以学习并掌握一门语言是最低要求了. C.SDK 光有一门语言是不够的,从事不论什么实际

在Fedora18上配置个人的Hadoop开发环境

在Fedora18上配置个人的Hadoop开发环境 1.    背景 文章中讲述了类似于"personalcondor"的一种"personal hadoop" 配置法.主要的目的是配置文件和日志文件有一个单一的源, 可以用软连接到开发生成的二进制库,这样就可以在所生成二进制库更新的时候维护其他的数据和配置项. 2.    用户案例 1.  比较不用改变现有系统中安装软件的情况下,在本地的沙盒环境中做测试 2.  单一源的配置文件盒日志文件 3.    参考 网页: