[学习笔记]Hadoop核心之初始MapReduce

MapReduce原理
MapReduce采用的是分而治之的思想,将一个大的任务分成多个小的子任务(称之为map),并行执行后,合并结果(称之为reduce)。
假如现在有一千副扑克牌没有大小王,然后将他们混在一起,其中有一副牌少了一张,所以总共只有51999张牌,现在我们要找出来缺少的是哪张牌。
这里写图片描述
这里写图片描述
我们可以这样来做:
这里写图片描述
首先,把牌大致分一下
这里写图片描述
牌很多,可以随机的分下,比如现在将其分成五份
这里写图片描述
然后由五个人来做
这里写图片描述
他们做什么呢?做的是:他们各自拿到自己的牌,然后进行map操作,这个map操作会统计出每种牌的每个花色出现的次数
这里写图片描述
比如他们每个map操作统计出红心A的出现的次数(这就是进行的map操作):
这里写图片描述
统计出来之后呢?需要进行数据交换,他们之间约定好,就是每个人统计出来的某个牌的某个花色交个其中一个人(看下边第二个图)
这里写图片描述
恩,下面就是指的上面说的第二个图,其中红心A交个第一个人,片子A交给第二个人,黑桃A交给第三个人……..等等…….。就是按照一定的映射关系规约进去
这里写图片描述
规约也就是说要进行reduce操作
这里写图片描述
reduce之后就是筛选出结果,如果呢,有张牌出现了999次那么就找到了少了哪张牌了。
这里写图片描述

这种相同的方法还可以用在浏览统计。比如:100GB的网站访问日志,找出访问次数最多的IP地址。这也采用先map再reduce这个方式。
首先呢把这个日志分一下(按照时间来切分),比如我们现在把日志分成5份:
这里写图片描述
然后map操作,统计出每个IP访问的次数,比如统计的是周数据(每个IP访问的次数/周),那么他们五个人,每个人都统计一下,第一周,第二周,第三周……的数据即可
这里写图片描述
然后看下图,依次是数据交换(通过哈希映射)、中间结果合并(就是把每个人统计相同IP的数据相加,就得到这个IP总共访问的次数)、对最终结果进行排序输出。
这里写图片描述
这样就知道了哪个IP访问的次数是最多的。其中最最最重要的是数据交换(根据一定的规则进行交换,才能去做后面reduce这个过程)
这里写图片描述


MapReduce的运行流程

基本概念

  • Job & Task
  • JobTracker
  • TaskTracker

Job它是一个任务,作业。一般来说job是什么呢?比如上面说的最多访问的IP地址是哪一个?这就是一个Job。
这里写图片描述
这个Job要被完成,需要被拆分成多个Task
这里写图片描述
这个Task中又包含MapTask和ReduceTask
这里写图片描述

Hadoop MapReduce体系结构中包含了两类节点:JobTracker和TaskTracker(包含:Map TaskTracker 和 Reduce TaskTracker)
这里写图片描述
JobTracker是一个master管理节点,客户端提交任务(Job)给JobTracker,JobTracker把它放在候选队列中去,在适当的时候调度选择一个Job出来。
这里写图片描述
这样这个Job才会被分成多个Map任务和Reduce任务
这里写图片描述
这些任务下发给TaskTracker来做,在部署的时候,通常TaskTracker往往和HDFS的DataNode是同一组物理节点,这样就保证计算是跟着数据走,比如分给我的任务所需要的数据刚好就在本机的DataNode里面,这样会保证读取数据以最快的速度读出来,以降低开销。这也是MapReduce的一个设计思想,就是用移动计算来代替移动数据。
这里写图片描述

JobTracker的角色

  • 作业调度(在作业候选队列里面以某种规则进行调度)
  • 需要分配任务、监控任务执行进度(在整个任务分发下去之后,任务分给TaskTracker在做的时候,TaskTracker是每隔几秒需要给JobTracker一个任务状态更新,告诉它目前执行到什么状况了)
  • 监控TaskTracker的状态(看看TaskTracker是否出现故障了等情况)

TaskTracker的角色

  • 执行任务
  • 汇报任务状态

MapReduce的作业执行过程

对于一个MapReduce的作业,它的执行过程是什么呢?看图:
这里写图片描述
第零步:任何一个任务过来先交到JobTracker里面
这里写图片描述
JobTracker才用一定的调度策略进行任务分配(map任务和reduce任务)
这里写图片描述
第一步:进行输入数据,进行分片
这里写图片描述
第二步:分片之后,按照一定规则分给TaskTracker,把分的片放在TaskTracker里面,分配map任务
这里写图片描述
第三步:分配好之后,进行map操作,之后会产生一些中间结果(Key-Value对),然后key-Value根据一些映射规则进行交换
这里写图片描述
第四步:交换之后,到Reduce端,进行Reduce任务(里面也是一些TaskTracker,只不过它们是做Reduce任务的)
这里写图片描述
第五步:Reduce任务完成之后(计算完成),输出结果写回到HDFS(数据可能是从HDFS来的,在中间过程,中间结果可能还会写到本地的磁盘,然后进行数据交换之后,把任务交给Reduce任务,完成之后再写回HDFS里面)
这里写图片描述

对于一个复杂的任务,在中间过程需要重复的MapReduce任务!


MapReduce的容错机制

  • 重复执行
    出错有可能本身就是Job的错,也有可能是硬件的错误,或者是数据的问题,这种重复执行的机制就是不管什么错误,我先尝试重复执行,就是再执行一次,再重复执行一次,当然不能无休止的进行,如果重复执行四次还是错误的,那就放弃继续执行。
    这里写图片描述

  • 推测执行
    推测执行就是在整个任务执行过程中,它需要等到我们所有的Map端算完之后,Reduce端才会开始
    这里写图片描述
    在这个时候,可能会有某一个节点算的特别特别的慢(下图中间那个),那么JobTracker就会发现其中有一个节点算的特变慢,它比别人慢的很多的时候,说明它出现了一点问题,那么推测执行这个时候就需要干点什么了!(下面连续三张图表示执行的一个对比过程,别人都执行完了,中间那和TaskTracker虽然还在计算,但是太慢了)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    推测执行会找来另外一个TaskTracker来和中间那个太慢的TaskTracker做同样的计算任务,慢的TaskTracker依旧继续计算,新找来的TaskTracker也做同样的计算任务,慢TaskTracker和新TaskTracker谁先计算完,就把后面还在计算的那个TaskTracker给终止掉!
    这里写图片描述
    比如下图中就会把还没计算完的(也就是前面那个慢TaskTracker)给终止掉!
    这里写图片描述
    这里写图片描述
    这样通过推测执行来保证整个任务的计算不会因为某一两个TaskTracker的故障或者其他问题导致整个计算效率很低!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值