?客户端指定map端读取数据位置,map端的并行度由客户端对文件的逻辑切片决定的.(文件大小,文件数量) 将maptask,reducetask提交给资源调度系统,资源调度系统将任务分配给虚拟机.
通过FileInputFormat的实现类TextInputFormat类的LineRecordReader方法来读取数据(以KV的形式). map方法在执行时是在一个循环中(Mapper类的方法中的循环) 每读取到一组KV,map执行一次.处理数据KV,生成新的KV,并通过context将数据写出. 数据被MapOutputBuffer类的collect方法收集起来,经过HashPartition类的getPartitioner方法,获取到一个分区编号,返回给collect. (new key,new value,int partioner) 新数据写到环形缓冲区(数组),只会写到80%,并且根据分区编号,进行区内排序(字典顺序排序),写到80%后,数据就会通过溢出器,将这些数据溢出到本地磁盘. 磁盘上的数据经过Merger组件将相同区的数据进行合并排序(数据依旧在本地磁盘) 数据在本地,外界不好拿取,这里会提供javaWebHttp的下载服务 reduceTask通过这个服务将属于当前分区的数据通过fetcher这个组件拉取(shuffle)过来. 拉取过来后,会经过merger组件将数据进行合并排序. 在经过GroupingConmparetor组件分组,相同key,value被放到迭代器中. 执行reduce方法,输出结果(TextOutputFormat指定输出路径).
|