Hadoop之Mapreduce详解

1、 什么是Mapreduce
   Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;
  Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,
  并发运行在一个hadoop集群上;

2、Mapreduce框架结构及核心运行机制
  2.1、一个完整的mapreduce程序在分布式运行时有三类实例进程:
    1、MRAppMaster:负责整个程序的过程调度及状态协调
    2、mapTask:负责map阶段的整个数据处理流程
    3、ReduceTask:负责reduce阶段的整个数据处理流程

  2.2、MR程序运行流程
    流程解析:
    1、一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动之后根据本次job的描述信息计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程
    2、maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:
      a).利用客户指定的inputformat来获取RecordReader读取数据,形成输出kv对
      b).将输出的kv对传递给定义的map()方法,做逻辑运算,并将map()方法输出的kv对收集到缓存
      c).将缓存中的kv对按照k分区排序之后不断溢出写到磁盘文件
    3、MrAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
    4、Reducetask进程启动之后,根据MrAppMaster告知的待处理数据所在的位置,从若干台maptask运行所在机器上获取若干的maptask输出结果文件,并在本地重新进行归并排序,然后按照相同的key的kv为一组调用客户定义的reduce()方法进行逻辑运算,并收集运算的输出结果kv,然后调用客户指定的outputformat将结果数据输出到外部存储

  2.3、MapTask并行度决定机制
    一个job的map阶段并行度由客户端在提交job时决定
    而客户端对map阶段并行度的规划的基本逻辑为:
    将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),
    然后每一个split分配一个mapTask并行实例处理

  2.4、FileInputFormat切片机制
    由FileInputFormat实现类的getSplits()方法
    FileInputFormat中默认的切片机制:
    a) 简单地按照文件的内容长度进行切片
    b) 切片大小,默认等于block大小
    c) 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

    FileInputFormat中切片的大小的参数配置
    通过分析源码,在FileInputFormat中,计算切片大小的逻辑:
    Math.max(minSize, Math.min(maxSize, blockSize)); 切片主要由这几个值来运算决定
    默认情况下,切片大小=blocksize

    选择并发数的影响因素:
    1、运算节点的硬件配置
    2、运算任务的类型:CPU密集型还是IO密集型
    3、运算任务的数据量

  2.5、map并行度的经验之谈
    1、如果job的每个map或者 reduce task的运行时间都只有30-40秒钟,那么就减少该job的map或者reduce数
    2、如果input的文件非常的大,比如1TB,可以考虑将hdfs上的每个block size设大,比如设成256MB或者512MB

  2.6、ReduceTask并行度的决定
    reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,
    Reducetask数量的决定是可以直接手动设置:
    //默认值是1,手动设置为4
    job.setNumReduceTasks(4);
    如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜
    注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,
    就只能有1个reducetask
    尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,
    或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。

3、MAPREDUCE中的Combiner
  (1)combiner是MR程序中Mapper和Reducer之外的一种组件
  (2)combiner组件的父类就是Reducer
  (3)combiner和reducer的区别在于运行的位置:
    Combiner是在每一个maptask所在的节点运行
    Reducer是接收全局所有Mapper的输出结果;
  (4)combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量
    具体实现步骤:
      1、 自定义一个combiner继承Reducer,重写reduce方法
      2、 在job中设置: job.setCombinerClass(CustomCombiner.class)
  (5) combiner能够应用的前提是不能影响最终的业务逻辑而且,combiner的输出kv应该跟reducer的输入kv类型要对应起来

  Combiner的使用要非常谨慎
    因为combiner在mapreduce过程中可能调用也肯能不调用,可能调一次也可能调多次
    所以:combiner使用的原则是:有或没有都不能影响业务逻辑

4、mapreduce原理篇
  4.1、mapreduce的shuffle机制
    1).mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle;
    2).shuffle: 洗牌、发牌——(核心机制:数据分区,排序,缓存);
    3).具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;

  4.2、主要流程
    shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的,
    整体来看,分为3个操作:
      1、分区partition
      2、Sort根据key排序
      3、Combiner进行局部value的合并

  4.3、详细流程
    1、maptask收集我们的map()方法输出的kv对,放到内存缓冲区中
    2、从内存缓冲区不断溢出到本地磁盘文件,可能会溢出多个文件
    3、多个溢出文件会被合并成大的溢出文件
    4、在溢出的过程中,及合并的过程中,都要调用partitioner进行分组和针对key进行排序
    5、reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
    6、reducetask会取到同一个分区来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
    7、合并成大文件之后,shuffle的过程就结束了,后面进入reducetask的逻辑运算过程中
    (从文件中读取一个一个的键值对group,调用用户自定义的reduce方法)

    shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上来讲,缓冲区越大,磁盘的io次数越少
    执行越快,缓冲区的大小可以通过参数调整,参数:io.sort.mb 默认100M

5、Mapreduce中的序列化
  5.1、hadoop自己开发了一套序列化机制(Writable),精简,高效

  5.2、自定义对象实现MR中的序列化接口
    如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,
    因为mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:
    public class FlowBean implements WritableComparable<FlowBean>

  5.3、Mapreduce与Yarn
    1).Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,
      而mapreduce等运算程序则相当于运行于操作系统之上的应用程序

    2).Yarn的重要概念
      1、 yarn并不清楚用户提交的程序的运行机制
      2、 yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源)
      3、 yarn中的主管角色叫ResourceManager
      4、 yarn中具体提供运算资源的角色叫NodeManager
      5、 这样一来,yarn其实就与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序,tez ……

      6、 所以,spark、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制即可
     
 7、 Yarn就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享

原文地址:https://www.cnblogs.com/atomicbomb/p/9904667.html

时间: 2024-10-12 09:05:42

Hadoop之Mapreduce详解的相关文章

hadoop之mapreduce详解(优化篇)

一.概述 优化前我们需要知道hadoop适合干什么活,适合什么场景,在工作中,我们要知道业务是怎样的,能才结合平台资源达到最有优化.除了这些我们当然还要知道mapreduce的执行过程,比如从文件的读取,map处理,shuffle过程,reduce处理,文件的输出或者存储.在工作中,往往平台的参数都是固定的,不可能为了某一个作业去修改整个平台的参数,所以在作业的执行过程中,需要对作业进行单独的设定,这样既不会对其他作业产生影响,也能很好的提高作业的性能,提高优化的灵活性. 现在回顾下hadoop

MapReduce:详解Shuffle过程

MapReduce:详解Shuffle过程[转] 博客分类: mapreduce MapreduceITeye数据结构多线程Hadoop Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混.前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.考虑到之前我在

hadoop fsck命令详解

hadoop fsck命令详解 hadoop  fsck Usage: DFSck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]        <path>             检查这个目录中的文件是否完整 -move               破损的文件移至/lost+found目录        -delete             删除破损的文件 -o

Hadoop RCFile存储格式详解(源码分析、代码示例)

RCFile RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件. 关键词:Record.Columnar.Key.Value. RCFile的优势在哪里?适用于什么场景?为了让大家有一个感性的认识,我们来看一个例子. 假设我们有这样一张9行3列的Hive数据表table,以普通的TextFile进行存储, 现在我们需要统计这张数据表的第二列(col2)值为“row5_col2”的出现次数

hadoop生态圈的详解

学习和使用hadoop有一年了,这里主要分享一下对hadoop整体上的理解,分门别类的介绍一下相关组件,最后提供了建议的学习路线,希望对hadoop的初学者有参考作用. 1.      Hadoop核心件组有哪些? 广义hadoop指什么? 核心组件有:Hdfs.Yarn.MapReduce; 广义上指一个生态圈,泛指大数据技术相关的开源组件或产品,如hdfs.yarn.hbase.hive.spark.pig.zookeeper.kafka.flume.phoenix.sqoop. 2.   

kettle连接hadoop&amp;hdfs图文详解

1 引言: 项目最近要引入大数据技术,使用其处理加工日上网话单数据,需要kettle把源系统的文本数据load到hadoop环境中 2 准备工作: 1 首先 要了解支持hadoop的Kettle版本情况,由于kettle资料网上较少,所以最好去官网找,官网的url: http://wiki.pentaho.com/display/BAD/Configuring+Pentaho+for+your+Hadoop+Distro+and+Version 打开这个url 到页面最下面的底端,如下图: ar

[转]MapReduce:详解Shuffle过程

Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混.前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.考虑到之前我在看相关资料而看不懂时很恼火,所以在这里我尽最大的可能试着把Shuffle说清楚,让每一位想了解它原理的朋友都能有所收获.如果你对这篇文章有

【转】MapReduce:详解Shuffle过程

原文:http://langyu.iteye.com/blog/992916  Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混.前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.考虑到之前我在看相关资料而看不懂时很恼火,所以在这里我尽最大的可能试着把

hadoop之wordCount详解

.图解MapReduce .简历过程: Input: Hello World Bye World Hello Hadoop Bye hadoop Bye Hadoop Hello Hadoop Map: <Hello,1> <World,1> <Bye,1> <World,1> <Hello,1> <Hadoop,1> <Bye,1> <Hadoop,1> <Bye,1> <Hadoop,1&