zoukankan      html  css  js  c++  java
  • 大数据之MapReduce工作机制

    MapReduce分布式计算系统,搭配yarn集群配合实现大数据计算任务。我们这里不讲MapReduce的代码具体实现,而是讲MapReduce的运行机制以及它的一些核心思想。了解了这些其实代码都很简单,只要有一些编程基础的人都会写得出那些代码。无非就是一堆文件的内容进行分解整合变换的过程代码。

    MapReduce采用的核心思想是大禹治水的“分而治之”的核心思想。将一个或一批较大数量的文件内容采用分发并行计算的方式对数据进行转换、抽取、汇总等。一般作为ETL中第一步Extract。很多人可能纳闷第二步Transform不也好像是这里做的嘛,都涉及到转换,其实不然,ETL的转换多数指的是从我们的ODS层的数据转换到关系型数据库中去,给最后的Load到页面上展示做准备的。好了扯得有点远了,接下来开始介绍MapReduce的运行机制。

      当我们要用MapReduce来计算一个或一些文件的时候,首先就是把我们的文件存放到我们的HDFS中去,HDFS会自动把我们上传的数据分好块,当准备工作做好之后,就开始执行我们的MapReduce。

      首先执行的就是我们的Map阶段,也就是的阶段

      • MapReduce读取数据是通过组件InputFormat进行读取的,默认采用的TextInputFormat,根据分片数来启用Maptask任务,有多少分片启动多少Maptask。
      • 读取数据是根据“ ”换行符结束,进行一行一行读取,到Maptask形成以<下标数,一行文本>格式的K1,V1键值对。
      • 通过Maptask自定义业务逻辑转换K1,V1成Maptask定义好的K2,V2
      • 转换完成K2和V2之后呢我们的MapReduce就进入了Shuffle阶段中的第一步Partition分区阶段,当你没有定义分区逻辑呢,MapReduce会自动使用默认的分区逻辑进行分区。
      • 分区之后呢并不是直接到Shuffle阶段的第二步排序,而是先把数据写入到我们的一个叫做环形缓冲区中,这个环形缓冲区其实就是一块内存数组,默认是100M大小,当写入内容达到环形缓冲区阈值的时候呢,这个阈值大概是整个环形缓冲区的80% 也就是80M的时候,它会溢出Spill
      • 然后对Spill溢出的数据进行一个排序和规约。这里的排序采用的算法是快排。然后对排序规约后的数据生成一个小文件。当然这个溢出动作可能不止一次,可能是多次。那么将会产生多个小文件,那么MapReduce呢就会对这些产生的小文件进行Merge,也就是合并操作。
      • 合并之后呢进入我们的Shuffle阶段的排序阶段,这里的排序就不是采用我们的快排算法了,而是归并算法。排序之后呢会生成一个临时文件,一个带有标识的临时文件,告诉后续的ReduceTask该去拉去哪个文件。

       到这里呢我们的Map阶段就结束了,我们可以大致把这个阶段分为两个小阶段,一个是处理读取数据的MapTask阶段,另一个呢就是处理完数据对数据进行分区,排序,规约的MapShuffle阶段。为什么要说是MapShuffle呢因为我们都知道完整的Shuffle阶段其实是有四大步骤的,分区、排序、规约、分组。而我们的MapShuffle阶段只处理了前三步,第四步分组是在我们的ReduceTask阶段又称为ReduceShuffle。

      然后呢就进入到了我们的Reduce阶段,也就是的阶段

      • Reduce阶段一开始并不是直接进入我们写的ReduceTask阶段,而是它会开启对应的Reduce缓冲区,去读取前面生成的带有标识的临时文件,比如说前面生成的临时文件带有两个标识,那么这里的Reduce阶段就好首先开启两块缓冲区,进行读取数据。
      • 当读取数据时缓冲区内的缓存达到了一定的阈值之后呢,这里Reduce阶段也会像之前Map阶段一样进行一个溢出当然这里叫做溢写更为恰当些。当多次溢写之后呢,Reduce阶段就会对这些溢写数据进行一个合并并排序,这里采用的排序算法呢就是合并算法。
      • 当对溢写数据合并并排序之后呢,Reduce就会对这些数据进行分组,关键点来了,是的这就是我们Shuffle阶段的最后一步分组,是在我们的Reduce阶段进行处理的。这里的分组是对我们早前生成的K2和V2进行一个分组,把数据合并成类似于<K2,<V2,V2,V2>>的这样的一个格式的数据,并生成出一个中间文件。然后进入我们写的ReduceTask阶段。
      • 进入我们的ReduceTask阶段呢Reduce会做什么呢?它会把之前处理的<K2,<V2,V2,V2>>数据经过我们写的代码转换成K3,V3进行输出,输出到我们指定的路径中。

    到此呢我们写的MapReduce的一整个运行过程就完了。其实只要能真正理解这个过程,那么我们写起MapReduce的代码就简单了。无非就是把各种文件里的内容通过这个过程转换成我们最终所想要的格式。

  • 相关阅读:
    触屏时间控制
    小程序 坐标算距离 (copy)
    微信小程序 对接口常用
    conversion function to_char to_number
    南通
    日期 function
    数字 function
    字符串处理函数
    沪通铁路1
    NVL NVL2 COALESCE NULLIF decode
  • 原文地址:https://www.cnblogs.com/sky9408251/p/12049692.html
Copyright © 2011-2022 走看看