io.block.size:64M
mapred.mapinput.min.splitsize:512M
io.sort.mb:512M
每个maptask的输入为512M的数据,在每个maptask中,发生了3次spill缓存溢写。
下面是通过日志统计出的各个细分阶段所用的时间:
每个TaskTracker都使用一个队列保存JobTracker分发过来的Task,我们将一个Task出队列的时间作为时间原点。
1. Hadoop首先将有关Task的文件(job.split,job.xml以及job.jar)从HDFS拷贝到TaskTracker的本地文件系统中,使用了不到1s的时间。这是因为job.split本来就在本地磁盘上。
2. 当所有需要的资源都已经被拷贝到本地后,Hadoop为这个Task启动一个TaskRunner线程,TaskRunner完成一些初始化工作,比如创建临时文件夹等等,最后TaskRunner启动一个子进程Child。此阶段耗时2s。
3. 子进程Child与TaskTracker进程通信,获得运行Task需要的JvmTask对象。此阶段耗时2s。
4. Child进程一开始有一些初始化工作,耗时2s。然后开始真正的运行maptask。