源码跟踪...
jobTracker在哪里运行?
taskTracker在哪里运行?
TaskTracker如何周期性的向JobTracker发送心跳?以什么方式?(线程?线程如何停止?如何回收?)
map在哪里运行?
map之前进行切割分片,每个切割分片开启一个map任务?
环形缓冲区如何分区,分区是在哪里运行的?分区是哪里控制的?代码在哪里?
分区的时候的排序是如何进行的?
map端和reduce端运行的会不会运行在同一台机器上?
MR框架是如何对key进行排序的?源码跟踪...
reduce端如何从map端复制数据?复制数据的时候有没有排序?合并数据的时候排序是怎么控制的?由哪块代码控制?
reduce数目如何确定?由谁确定?
reduce在哪里运行?
下面是MapReduce的流程,(纯语言描述,不直观,后面有空再补上图片吧)
1、对读取的文本进行split ,每个split格式是<K,V>对,K是行偏移量,V是行的整条字符串,每个split启动一个maper task, maper任务可能在集群中不同的机器上执行。
2、maper任务在对输入<K,V>对的V进行分割,形成新的<K,V>对,
3、maper任务输出的<K,V>对,先放入环形缓存区里面(大小是100M,可配置),如果达到80%,则溢写到本地磁盘,
4、在溢写的过程中,会放生 partition,sort,combine操作。
5、partition操作就是对不同的数据按需进行分割开,(比如有两种数据,一种是手机号,一种是非手机号,可以分为两个分区,手机号的数据丢在一个文件,非手机号则丢在一个文件)
6、sort就是排序,写入磁盘的时候,按一定的秩序进行写入
7、combine就是将相同的K的V进行相加,从而对数据做到压缩的效果,这样通过网络copy到reduce task的服务器上时,减少网络带宽的使用,提高效率
8、从不同机器上copy文件到reduce task机器,一开始先写在缓存中,达到80%则溢写(这个和maper端的溢写类似)
当然溢写的过程中又可以进行一次 partition,sort,combine
9、这里可能有人会疑问,maper端不是分区,排序和合并了嘛?为啥到reduce端还要再进行一次呢?
原因很简答,我们知道每个split分发给maper task,而mapper task任务是在不同的机器上执行的,每个maper端的分区,排序,合并只是对单台机器上的数据进行的,而reduce端是从不同的机器copy数据到reduce task服务器上,来自不同机器上的数据可能还存在K相同的数据,所以reduce端还要进行分区,排序,合并,并且reduce端是对所有数据进行分区,排序,合并,reduce端的分区排序合并也叫做merge
10、数据准备好后,数据会输入到reduce task,统一将不同分区的数据进行V的count也就是相同K的<K,V>,V要进行累加,最终输出结果到hdfs上