mapreduce

 

3.4.1、Map的过程

 

MapRunnable从input split中读取一个个的record,然后依次调用Mapper的map函数,将结果输出。

 

map的输出并不是直接写入硬盘,而是将其写入缓存memory buffer。

 

当buffer中数据的到达一定的大小,一个背景线程将数据开始写入硬盘。

 

在写入硬盘之前,内存中的数据通过partitioner分成多个partition。

 

在同一个partition中,背景线程会将数据按照key在内存中排序。

 

每次从内存向硬盘flush数据,都生成一个新的spill文件。

 

当此task结束之前,所有的spill文件被合并为一个整的被partition的而且排好序的文件。

 

reducer可以通过http协议请求map的输出文件,tracker.http.threads可以设置http服务线程数。

 

3.4.2、Reduce的过程

 

当map task结束后,其通知TaskTracker,TaskTracker通知JobTracker。

 

对于一个job,JobTracker知道TaskTracer和map输出的对应关系。

 

reducer中一个线程周期性的向JobTracker请求map输出的位置,直到其取得了所有的map输出。

 

reduce task需要其对应的partition的所有的map输出。

 

reduce task中的copy过程即当每个map task结束的时候就开始拷贝输出,因为不同的map task完成时间不同。

 

reduce task中有多个copy线程,可以并行拷贝map输出。

 

当很多map输出拷贝到reduce task后,一个背景线程将其合并为一个大的排好序的文件。

 

当所有的map输出都拷贝到reduce task后,进入sort过程,将所有的map输出合并为大的排好序的文件。

 

最后进入reduce过程,调用reducer的reduce函数,处理排好序的输出的每个key,最后的结果写入HDFS。

你可能感兴趣的:(hadoop)