大数据运算系统——MapReduce

本节简要的介绍大数据运算系统——MapReduce——设计思路,实现方式,系统结构

MapReduce/Hadoop简介

搞大数据的都知道MapReduce和Hadoop,那么他们什么关系? MapReduce是谷歌与2004年提出的一个并行分布式计算平台,该平台使用C++实现,Hadoop是其Java版的开源实现。
目前,Hadoop已经广泛应用于各互联网公司,例如BAT,Facebook等。

MapReduce的编程模型

本节主要从MapReduce设计者的角度阐述MapReduce的设计思想。

整体思路

那么这个大名鼎鼎的MapReduce到底是干啥的?它出现的背景是啥?是为了解决什么样的问题?

众所周知,并行分布式程序是相当难设计的,为了开发出一个性能优良又执行准确的并行程序 开发者需要掌握多线程、网络通信、数据分发、任务分发、容错管理以及分布式程序的Debug等技能。这对开发者提出了很高的要求,然而聘请如此高水平的开发者对互联网公司来说是很昂贵的。因此,如果能够有一个平台,普通的开发者只需要编写串行程序,保证串行程序的正确性,而不用关注程序的并发执行,这样不就完美了吗?这样那些互联网大厂就可以以较低的成本招更多的水平一般的程序员,让他们培训一两个月即可上手开发原本需要精心设计的并行分布式程序。而这,也就是MapReduce的基本思想。
在这里插入图片描述
于是,MapReduce对这个问题的解决思路就是:普通程序员编写串行程序,保证串行程序的准确性;MapReduce系统完成并行分布式的执行。

然而,这种通用的平台自然而然也会限制程序的功能。这是说,并不是所有分布式程序都可以满足MapReduce的编程范式,比起自由设计并行分布式程序 MapReduce自然也就会设置很多的条条框框。因此MapReduce定义的编程范式应该具有很强的代表性,它应该能够适配最常见的互联网公司的并发业务需求,否则如果它解决的不是代表性任务那它的生命力也就不会那么强了。

数据模型

在MapReduce的内部中,所有的待处理的业务数据都是<key,value>这种记录形式。记录之间是无序的,同一个key可以对应不同的value. 。这种key-value并不是严格意义上的映射。当然key-value的具体含义是由开发者自定义的。反映到实践中,就是MapReduce使用泛型编程技术,需要使用者为Key-value指定类型。

MapReduce的一共有三个核心函数。Map,Shuffle,Reduce。

  • map
    map的输入一个个的key-value记录,它的输出是0个或多个的key-value.
    用<ik,iv>表示输入的key-value,输出的记录为<mk,mv>。那么 m a p ( &lt; i k , i v &gt; ) = { &lt; m k , m v &gt; } map(&lt;ik,iv&gt;)=\{&lt;mk,mv&gt;\} map(<ik,iv>)={<mk,mv>}
    在这里插入图片描述
  • shuffle
    shuffle执行的是一个group by的操作。shuffle把map的输出集合 { &lt; m k , m v &gt; } \{&lt;mk,mv&gt;\} {<mk,mv>}做为输入,把相同的mk对应的mv组织在一起形成集合 { &lt; m k , { m v } &gt; } \{&lt;mk, \{mv\} &gt;\} {<mk,{mv}>}
    在这里插入图片描述
  • reduce
    reduce则是将shuffle 分组好的一条条 { &lt; m k , { m v } } \{&lt;mk,\{mv\}\} {<mk,{mv}} 结果再进行操作。
    在这里插入图片描述

将这三步综合起来就是:
在这里插入图片描述
其中程序员编程Map—Reduce的逻辑,系统自动完成shuffle的过程。

系统实现

Hadoop Mapper.java

在这里插入图片描述
Hadoop的设计哲学是:程序员编写Mapper和reducer的子类,在子类里面设计map和reduce过程中的逻辑,实现其中的run函数。然后由hadoop调用这两种子类的run函数。
对于上面的mapper来说,核心的成员函数为map和run函数。
其中run函数被hadoop调用,里面存在一个while循环,不断从context取出<ik,iv>记录,
对于每一条记录再调用map函数执行相应的操作。注意,数据是通过context.write来执行写入操作的。

Hadoop Reducer.java

在这里插入图片描述
reducer的设计逻辑同mapper,只不过每次传入reduce是key和vlist而已。

一个栗子 wordCount

wordCount的任务是统计文本中每个单词出现的次数,它的主要流程是:
在这里插入图片描述
map输入是<行号,行内容>,输出是{单词mk,单词mk出现的次数}。
shuffle输入是{单词mk,单词mk出现的次数},输出是{单词mk,{单词mk出现的次数} }。这个过程会把不同行的相同单词出现的次数都统计在一个list.
reducer的输入是{单词mk,{单词mk出现的次数} },然后对这个单词所有出现的次数求和。

在这里插入图片描述
在这里插入图片描述
最后再进行调度。。
在这里插入图片描述

MapReduce与SQL比较

MapReduce可以看做是实现了一个功能很强大的SQL Select,他们的对比如图:
在这里插入图片描述
map的过程中需要遍历每一行,取出特定的列,它其实对应了SQL的select和prOject。而shuffle是将相同的mk放在一起,这个其实就是group by mk的功能。
reduce完成求和的运算,类似于sql的聚合操作,但是reduce可以完成其他一些很高级的SQL不易实现的操作。

MapReduce系统架构

MapReduce是典型的master-work主从式结构。map-reducer里面会有一个jobtracker是协调服务器,协调不同worker之间的工作进度、任务分发。mapreduce一般会从分布式文件系统读入数据,并把reduce后的结构写回分布式文件系统。
在这里插入图片描述
在这里插入图片描述

MapReduce的运行过程是:

  1. 首先用户向jobtracker提交作业,提交作业的时候指定map/reduce的jar文件,配置信息(几个mapper,即可reducers),输入路径、输出路径。
    在这里插入图片描述
  2. Map Task 读数据
    接着 Jobtracker指示mapper们去HDFS读取数据块,一个数据块叫做一个Split。然后把Split分配给不同的Mapper。程序员需要告诉hadoop如何把输入的原始文件转换为key-value,这个主要由Input Format来指定,如上面的wordCount例子所示。
    在这里插入图片描述
    在这里插入图片描述
  3. Mapper处理数据
    在这里插入图片描述
    对于每一个mapper的每一个split:
  • 对于每一条<ik,iv>记录调用一次重载的map函数生成<mk,mv>

  • 然后context.write写入的时候根据每一个mk调用Partitioner计算reducer task id。这个id指示这个<mk,mv>应该丢给那个reducer去处理。例如上图就把不同的mk分到两个reducer上去了。

  • 按reducer task id的不同,把不同的<mk,mv> 保存到不同的本地文件上。同时对保存的文件按照mk递增顺序排序。
    为什么要把整个<mk,mv> 保存的本地文件系统呢? 这主要是有两方面原因:1. HDFS保存过程很慢,不适宜。2.这个只是中间结果,没必要去保存。当reducer要使用的时候,来mapper取就是了。

  1. shuffle执行group by mk的操作
    在这里插入图片描述
    reducer们从mapper里面提取 reducer task id归属于自己的<mk,mv>记录。例如在上图中,对于reducer1来说它从mapper1,mapper2,mapper3提取reducer task id 为1 的那个记录文件。

取得数据后,reducer使用归并排序执行group by .

  1. reducer执行reduce
    在这里插入图片描述

MapReduce的容错

在mapReduce里面,task tracker定期向jobtracker发送心跳包,报告自己的执行进度。jobtracker及时发现不响应或者运行缓慢的异常机器,这些机器叫做straggles.
在这里插入图片描述
当jobtracker检测到又straggler的时候,就把这个straggler的任务分配给其他机器完成。

  • 如果straggler是个mapper,那么job tracker把整个mapper的split数据块分配给其他节点,然后通知shuffle和reducer从新的节点拉取数据。
  • 如果straggler是个reducer,那么就让一下新的节点去相应的mapper取数据,shuffle数据,reduce数据。因为mapper里面的中间结果是有序的保存在本地文件系统,因此新的reducer可以多次的去取这些数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值