3 个回答
MapReduce的过程主要分为5部分;Input、Map、Shuffle、Reduce、Output,其中整个过程经过了3次排序。
Input阶段是map任务从hdfs读取分片数据
Input阶段是map任务从hdfs读取分片数据
1、InputFormat输入格式类采用默认的TextInputFormat将输入文件分成一个个分片InputSplit,然后每个Map任务对应一个split分片,有几个分片,就生成几个map任务
2、RecordReader(记录读取器)类读取分片数据,一行记录生成一个键值对,把所有记录读完后,会生成多个键值对,这些键值对会传入map任务的map()方法,然后调用map()方法。(map()里面写了什么代码,就会进行什么操作)
Map阶段:1、对数据进行切片处理,默认为128mb 1个切片
2、对切片进行格式化转换,格式化为<Key,value>形式的数据,其中Key代表偏移量,Value代表每行数据
发布于:3个月前 (01-24) IP属地:四川省
Shuffle阶段:
1、MapTask收集格式化后的<Key,value>键值对数据,放入内存缓冲区中
2、内存缓冲区(默认大小100M)被占满80%时,启动溢写进程,把缓存中数据溢写到HDFS文件中。剩余20%用于溢写过程中存放Map输出的键值对,避免Map输出的键值对丢失。这样溢写不会影响Map的正常运行。
3、在溢写过程中, MapReduce 框架会对 key 进行排序,如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写文件,如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。
4、在环形缓冲区中会对数据进行分区 partition,然后再分区内部进行排序(因为不同分区会对应不同的reduceTask所以再内部分区就可以)这里的排序使用的是快速排序,按照字典顺序对key排序。
5、若设置了map端本地聚合combiner,则对每个分区中,排好序的数据做combine操作;若设置了对map输出压缩的功能,会对溢写数据压缩
Reduce阶段:1、所有的MapTask任务完成后,启动相应数量的ReduceTask(和分区数量相同),并告知ReduceTask处理数据的范围
2、ReduceTask会将MapTask处理完的数据拷贝一份到磁盘中,并合并文件和归并排序
3、最后将数据传给reduce进行处理,一次读取一组数据
Output阶段:1、最后将Reduce阶段的结果通过OutputFormat输出。
发布于:3个月前 (01-24) IP属地:四川省
我来回答
您需要 登录 后回答此问题!