单文件统计单词出现的次数
map阶段
- 框架会将输入文件/文件夹划分成很多的inputsplit,默认每个hdfs的block对应一个inputsplit。通过recordreader类,把每个inputsplit解析成一个个的<k1,v1>。默认,每一行,会被解析成一个<k1,v1>。(k1是行首偏移量,v1是当前行内容)
- 框架调用Mapper类中的map(...)函数,map函数形参是<k1,v1>,输出是<k2,v2>。(k2是具体的单词,v2是出现的次数)一个inputsplit对应一个map task。(每个k1v1对都要执行一次map函数)----需要自己实现,其他由框架实现
- 框架对map函数输出的<k2,v2>进行分区。不同分区中的<k2,v2>由不同的reduce task处理,默认只有一个分区。
- 框架对每个分区中的数据,按照k2进行排序分组。分组指的是相同k2的v2分成一个组。
- *在map节点,框架可以执行reduce归约(局部聚合),此步骤为可选项。
- 框架会将maptask输出的<k2,v2>写入到Linux的磁盘文件中。
map阶段结束
reduce阶段:
- shuffle过程(拉取数据):框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点
- 框架对reduce端接收到的相同分区的<k2.v2>数据进行合并、排序、分组。
- 框架调用reducer类中的reduce方法,输入<k2,v{v2.....}>,输出<k3,v3>.(k3是具体的单词,v3是单词出现的次数)。一个<k2,{v2...}>调用一次reduce函数(函数内部的业务逻辑需要实现)。----需要自己实现,其他由框架实现
- 框架将reduce的输出保存到HDFS中。
reduce阶段结束