Hadoop源码分析(1)————MapReduce之整体流程分析

欢迎来到何大鹰的Hadoop理解内容

由于Hadoop已经火了有一段时间啦~,所以编译hadoop和部署hadoop的内容在这里我就不多讲了,编译hadoop大家可以看看这篇博客https://blog.youkuaiyun.com/cruise_h/article/details/18709969
至于部署hadoop大家完全可以按照官网上的文档慢慢配置,还可以练习一下英文阅读能力。
运行和编译hadoop的环境我还是比较推荐ubuntu。


  • 然后来到正文内容

像平时一样,我们还是通过hadoop最最普遍的程序————wordcount来当做我们的切入点,当你成功配置好了一个hadoop环境之后(我们这里以伪分布式或者分布式来当做典型,单机模式我们就不提了),我们设置好测试数据,然后满怀激动的启动了wordcount,hadoop就会经历大概以下几步。

  • 根据jobconf启动job
    job是hadoop的作业,一个hadoop理论上可以启动多个job,也就是hadoop的作业。在目前这种情况下,也就是wordcount这个作业。

  • job启动task
    job被成功启动后,job就会去启动Task,也就是任务,但每个job究竟是启动多少个任务呢,据官方说法,数据量每达到一个128M,就会启动一个task,也就是说,具体启动多少个task是根据所计算的数据量决定的。~JOB会把输入数据分割成几个部分,然后分给被启动的task。

  • job启动task
    每一个task都有两个部分
    (1)MapTask
    MapTask类继承与Task类
    MapTask一般主要有五项工作

    read:通过RecordReader从InputSplit分片中将数据解析成一个个key/value。
    map:将由RecordReader解析出的key/value交给map()方法处理,此处所说的是用户自己编写的map函数,经历这个函数可以让数据生成一个个新的符合用户需求的key/value。
    collect:将map()中新生成key/value由OutpCollector.collect()写入内存中的环形数据缓冲区。
    spill:当环形缓冲区达到一定阀值后,会将数据写到本地磁盘上,生成一个spill文件。在写文件之前,会先将数据进行一次本地排序也就是merge函数,必要的时候(按配置要求)还会对数据进行压缩。
    combine:当所有数据处理完后,将所有的临时的spill文件进行一次合并,最终之生成一个数据文件。这一步是用户可选的,如果不主动调用合并的话是不会被执行的。

    (2)ReduceTask
    ReduceTask的主要过程总体来说相对比较简单,但是细节部分非常精细,其中的Shuffler过程,更是常常被称为奇迹发生的地方。在shuffler中有两个线程比较重要。这两个线程是并行运行的。
    1、EventFetcher
    由于Hadoop的架构非常庞大,如果还是仅仅依靠像小架构那样的通过流程控制来掌控整个程序运行的走向,是非常不现实的。大部分庞大架构的软件系统都是通过状态机来控制的,而根据我们对于MapReduce的理解,Reduce是在Map将结果写入到磁盘后也就是Map任务完成后开始启动的。理所应当,当前这个线程的主要任务就是,在MapReduce的事件队列中取到所有关于MapTask执行完成的事件,
    并且从事件中剥离出相关信息,把已经确认执行无差错完成的Map节点的信息放入一个list结构中。
    2、Fetcher
    这个线程的任务是基于EventFetcher线程的,它会通过一个随机函数取出list中的一个Map节点的信息然后通过剥离出有用的信息,在相应的Map节点中将自己的数据取到自己所在节点上。
    以上两个线程完成后,就是shuffler的主要部分了,通过不断地merge等操作从而得出真正的结果并写入HDFS,由于我目前的任务不涉及到Reduce的merge以及以后的工作,所以这里就不再赘述。上述所提到的内容的具体的源码部分,会在以后的博客中慢慢更新。

  • task启动attempt
    然后的就是我自己的一些理解,我也无法确认我理解的正确性,如有错误,欢迎大家指正,谢谢。
    我想说的是,在我的理解中,每个Task并不是只有一个进程会真正执行,而是拥有很多个,每个task会以不同的方式启动多个执行策略,可能有推测执行,尝试执行,等等执行策略,当哪个执行策略以一个最快的速度正确的执行完成后,task则确认这个正确数据就是Task最后的结果,而其他的执行策略可能会被卸载掉,

用图来说可能大概就是这个意思
这里写图片描述

目前我所阅读的源码大概包含了以上的流程,后面会通过状态机,Spill ,发送时间的通信协议,EventFetcher ,Fetcher等作为切入点说一说源码的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值