美文网首页
Hadoop分布式计算框架MapReduce

Hadoop分布式计算框架MapReduce

作者: 大龄程序员在帝都 | 来源:发表于2016-08-15 20:25 被阅读606次

    分布式计算框架有很多,只是适合做的种类不一样

    1、MapReduce适合做离线计算
    2、storm适合做流式计算,更适合实时计算
    3、spark是内存式计算框架,更适合做快速得到结果的计算

    MapReduce设计理念

    一、何为分布式计算。
    移动计算,而不是移动数据。

    把计算程序都进行部署到不同的机器上,然后在不同的机器上进行计算,然后进行汇总,做到不移动计算的数据,也能得到计算结果

    MR(MapReduce)计算框架图解

    Paste_Image.png

    解决大数据的问题:解决两个问题
    1、数据存储(HDFS)
    2、数据计算(MapReduce)

    首先对数据进行处理split为每一个数据片段,每一数据片段都会有一个map线程去执行,如果有多个片段会并发的同时执行。

    所以:如上图:
    第一个步骤是:如何把数据切片,按照什么规则去切分。
    第二个步骤是:就是map部分
    第三个步骤是shuffle部分
    第四个部分是 reduce部分
    第五个部分就是 输出部分(计算生成的数据,也是保存在HDFS上)

    整个MR过程就是:就是把HDFS数据进行计算处理,然后输出结果

    实例MR计算

    Paste_Image.png

    如上:
    步骤一:splitting
    步骤二:Mapping
    步骤三:Shuffling
    步骤四:Reduceing
    步骤五:Final result

    在shuffling阶段会有相应的合并和排序
    有可能reduce为一个或者多个,这个是由程序去决定

    hadoop计算框架Shuffler

    Shuffer的功能

    在mapper 和reducer中间的一个步骤
    可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里
    可以简化reducer过程


    QQ20160815-0@2x.png

    如上图:

    map过程

    map是一个Java程序,或者其他计算机程序,map得到的结果在内存中, 内存有一定的阈值,当到达一定的阈值后,就需要写入到磁盘中, 这个过程叫做溢写。

    在写入之前要做几件事情,partion和sort。把当前map的数据进行输出和排序,然后再溢写到磁盘。放在磁盘中的数据是已经排好序的数据。

    什么是partition?

    partition分区的数据是为以后产生作用的。把map的输出数据分成一个一个区,partition可以由程序员自定义编写代码。如果不写按照默认的分区模式进行分区,默认的分区模式是什么呢? Hash模运算
    1、获取hash值,每个对象的hash值得到一个整数,把这个整数模reduce的个数,得到一个结果。假如:hash模2,只有两种结果0或者1,然后map的结果分成了两个部分,0区或者1区。

    分区有什么作用??? 这是mapredure如何结局负载均衡和数据倾斜?

    分区是为了把map的输出进行负载均衡,解决数据倾斜的问题。这样后期通过reduce进行计算的数据就不会有数据倾斜问题,一个计算的过多,一个计算的过少。这就是分区的作用。

    map为什么不会数据倾斜???
    map的数据是切片,每一片的大小相等,所以map的输入数据不会出现数据倾斜的问题。

    sort
    sort也有默认的的sort。默认的sort是按照ascii进行排序的。(即按照字典进行排序的)
    为什么要sort???
    定义排序规则


    上图中merge on disk什么意思???
    每次都会溢写到磁盘中,溢写会按照hash值进行合并,相同hash值放到一起。每一次溢写就会生成一个文件,溢写的次数越多,生成的文件越多,这些文件需要进行合并为一个大的文件,如何合并,就是按照hash值进行合并,这是默认的规则。

    合并的目的???
    减少map的输出,因为后期reduce会移动map的输出到reduce服务器上,减少map的输出,就会减少网络io的操作,所以很有必要的。

    以上是map的处理


    reduce过程

    map的处理结果落到磁盘以后,然后会进行merge,为什么merge,如果merge???

    reduce 的输入数据就是map的输出数据
    reduce的数据来源是map输出数据的拷贝
    拷贝哪些数据,是根据partition的结果,只拷贝分给对应的reduce的数据

    之前分区是按照reduce去模后的值进行分区的,分区以后的数据在copy到reduce所在的机器上,同事进行merge,便于下一步reduce进行处理。

    分区就是在把数据拷贝到reduce的时候起作用的

    为什么reduce task开始也有merge操作???
    因为reduce会从很多的map输出结果中拷贝数据,这样会有很多个小文件,reduce为了计算,就需要对这些小文件进行merge。这就是为什么reduce开始时要进行merge操作。这个合并不是人为控制的,这个会根据key相同的进行合并,是hadoop自有的功能。合并完成以后相同key的数据会进行merge。

    两个reduce是可以并发的。

    抓重点:
    这个过程比较虽然比较复杂,但是有很多部分是hadoop框架已经做的工作,只有一部分需要我们编程实现!!!

    哪些部分需要我们编程实现???

    1、partition(如何分区)
    2、sort 比较(如何比较)
    3、比较会进行多次
    4、combiner

    map中计算框架shuffle过程详解

    222.png

    注意:在map执行之后,立刻进行partition,map的输出结果会分到哪个reduce,这个叫做分区,分区以后放在内存中,在溢写的时候,要执行sort和combiner,sort其实就是比较,默认按照ascii大小进行比较。 combiner可能会没有,所以上副图没有画combiner,这个意思是初次合并。

    combiner可以减少map的输出数据,


    333.png

    reduce中关于shuffle过程的详解

    444.png

    MapReduce的Split大小

    1、max.split(100M)
    2、min.split(10M)
    3、block(64M)
    如何进行切分,切分大小算法
    4、max(min.split,min(max.split,block))
    代入如上值为: 64M

    相关文章

      网友评论

          本文标题:Hadoop分布式计算框架MapReduce

          本文链接:https://www.haomeiwen.com/subject/vckysttx.html