MapReduce

MapReduce

介绍

MapReduce是hadoop生态中的一个批量计算的框架,基于该框架,程序员能够容易地编写应用程序。这些应用程序能运行在分布式系统上,并以可靠的、具有容错能力的方式并行地处理TB级别的海量数据。
MapReduce的思想核心是“分而治之”:

  • map负责“分”,把复杂的任务分解成若干个简单的任务来并行处理。
  • reduce负责“合”,对map阶段的结果进行汇总。

MapReduce可以运行在yarn(Resource Manager、Node Manager)集群上,也支持在本地运行(再本地运行为了调试)。

MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件组合成一个完整的分布式运算程序,并发地运行在集群上。
MapReduce为程序员隐藏了大多数的系统层面的处理细节。程序员仅需要关心其应用层的具体计算逻辑问题,只需要编写少量的程序代码就可以完成海量数据的处理。
那么程序员需要care的编程流程有哪些呢?

编程流程

MapReduce的编程流程一共有3个阶段:map、shuffle、reduce阶段。

  1. map阶段有2个步骤(<k1,v1> -> <k2,v2>)
  • 1)编写InputFormat类,对数据进行split,split成k1和v1
    • InputFormat类会通过getSplits方法对输入目录中的文件进行逻辑切片(split)得到block,有几个block就会对应启动多少个Map任务。
    • 在把文件split成多个block后,会用RecordReader类进行读取,返回<k1,v1>。
  • 2)编写map类,将<k1,v1>转换为<k2,v2>
    • 读取block返回的<k1,v1>,执行map类中的map函数(RecordReader每读取一次就会调用一次),把<k1,v1>转换为<k2,v2>
    • <k2,v2>通过context.write进行collect(数据收集)
  1. shuffle阶段有4个步骤(<k2,v2> -> <k2,List>)
  • 3)对<k2, v2>进行partition(分区),属于map端的shuffle
    • 在collect中会先对其进行partition处理,作用是根据key或value以及reduce的数量来决定<k2,v2>最终会交给哪个reduce task处理(均衡数据,避免数据倾斜)。
    • 将数据写入内存,内存的这边区域叫做环行缓冲区,缓冲区的作用是批量收集map的结果,减少磁盘IO的影响。该缓冲区是有大小限制的,默认是(缓冲区大小100MB,溢写比例0.8)。也就是当缓冲区的数据已经达到80MB的时候,会启动溢写线程,把80MB的数据写到磁盘中,而map输出的结果还可以往剩下的20MB中写,互不影响。
  • 4)在每个分区中,对数据按照相同的key进行排序。属于map端的shuffle
    • 当溢写线程启动后,会对80MB空间内的key进行sort
  • 5)对排序过的数据进行combiner(规约),降低数据的网络拷贝。属于map端的shuffle。
    • 如果有配置combiner,会进行相应的操作。
    • 每次溢写都会在磁盘上产生一个临时文件,如果发生了多次溢写,那么会有多个临时文件。当整个数据处理解说后,会对磁盘中的临时文件进行merge,最后merge成一个文件,写入磁盘。
  • 6)对数据进行分组,相同的key的value放入同个集合。属于reduce端的shuffle。
    • 设置了几个reduce就会有几个reduce缓冲区,数据会先写入环行缓冲区,如果溢出,那么还是会对溢出的小文件进行合并,再合并过程中会对数据进行排序、分组,最终形成一个中间文件。
  1. reduce阶段有2个步骤(<k2, List> -> <k3,v3>)
  • 7)编写reduce类对输入的<k2,List>,进行处理,转换为<k3,v3>
    • reduce对中间文件进行处理,得到<ke,v3>
  • 8)设置OutputFormat处理并保存输出的<k3,v3>数据
    • 输出数据到指定目录,输出文件的个数等于reduce个数

mapreduce流程

举个例子

MapReduce在集群上如何运行

那么编写好的mapreduce是如何运行在集群上的呢?
架构体系图

  1. 客户端向yarn集群的ResourceManager提交一个mapreduce计算任务。ResourceManager收到任务后,会启动2个组件:Application Manager、Resource Scheduler。
  2. Application Manager在某个Node Manager上启动一个进程:App Mstr。
  3. App Mstr向Application Manager申请资源(cpu、内存…)。
  4. Resource Scheduler把申请到的资源列表反馈给App Mstr。
  5. 根据资源列表,向node manager索要资源。
  6. node manager启动container执行map、reduce task。
  7. 将计算结果以及状态汇报给App Mstr。
  8. 将计算结果以及状态汇报给Application Manager。

计数器

计数器是收集作业统计信息的有效手段之一。主要用于应用级的统计、辅助诊断系统故障。主要通过context.getCounter来获取。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值