MR流程三步骤

Map端

  1. 用户提交的任务文件,在hdfs做了一个预切分,切分是交由FileInputFormat类按照默认block块大小128M进行切分,切分非物理切分,而是逻辑切分。形成了对应的split文件。----->例如:a.txt(200M),按照128M切分就会形成两个split。注意:split的个数决定了MapTask的数量
  2. 接着,TextInputFormat中的成员变量RecordReader中的read()方法,将文件中的数据进行读取,读取呢?行偏移量就是K1,行内容就是V1–(这就是MR程序中,Mapper中方法中的K1,V1)。
  3. 形成了K1,V1。就到了用户自定义编写的Map方法,运行完Map方法会调用context.write()方法输出k2,v2。其实这个方法触发了OutputCollect.collet()方法,将数据传入环形缓冲区当中,就开始了shuffle阶段。

Shuffle端

  1. 数据进入了环形缓冲区。环形缓冲区默认大小为100M,当数据量达到80%的时候,就会进行溢写。这里不进行环形缓冲区详细描述
  2. 溢写,并非立刻溢写到本地磁盘。溢写之前又进行了这些小步骤。嗯。①分区②排序③写入本地磁盘。
  3. 分区,分区它是默认是hashpartitioner方法对key进行排序。默认分区数为1。
  4. 排序,对分区中的数据,按照key进行排序,排序的手段是快排,按照字典序进行排序。区内有序
  5. 溢写到了本地磁盘,80M对大数据来说,其实就算小文件了,当MapTask执行完成之后就会有很多80M的小文件了,这个时候就会对文件进行一个merge合并。
  6. 如果有combiner,可以使用combiner对数据提前进行计算。但是,在不影响业务的前提下,比如说求和,但是求平均数这样的就不行。
    combiner就是对MapTask的输出进行局部汇总,减小网络的传输量

Reducer端

  1. ReduceTask的数量,是按照前面的partition的数量决定的。默认情况下为1
  2. reduceTask拉取前面的数据,然后将其放入到内存当中,当内存满了之后,就写入到磁盘,直到所有的数据文件都拉取完毕。
  3. merge合并内存和磁盘上的文件。
  4. 嗯,接着就是将文件中的数据,运行用户写的Reduce方法了。运行完之后就输出,输出位置看需求了,一般都是HDFS。

【大数据面试常问问题】----MR运行流程【非深入】

每篇一言: 少年郎肩头要挑的是草长莺飞和杨柳依依呀。

相关文章: