MapReduce计算过程中,中间数据要落盘,但是这些数据不存在备份,一旦丢失,就要重新计算。所以为了提高数据的可靠性和并发写性能,Hadoop允许TaskTracker配置多个挂在不同磁盘的目录作为中间结果存放目录,对于任意一个作业,Hadoop会在每个磁盘中创建相同的目录结构,然后采用轮询策略使用这些目录(由类LocalDirAllocator实现)
TaskTracker上的目录分两种:数据目录和日志目录,数据目录存放执行任务所必须的数据(比如jar包、作业配置文件)和运行中临时产生的数据;日志目录存放TaskTracker和Task运行时输出日志。
数据目录
TaskTracker在每个磁盘上为作业创建了相同的目录结构,且采用轮询的方式使用这些目录。
对于一个task,可能创建工作目录work和输出目录output,为了分摊写负载,TaskTracker可能将work目录和output目录分配到不同的磁盘中。
考虑到Reduce Task可能会运行失败,且每个Reudce Task要从所有Map Task中获取部分输入,因此,所有任务目录不会在作业运行过程中被删除,而是确认作业运行完成后,统一将其删除。
日志目录
日志目录创建:
不同于数据目录,hadoop只允许TaskTracker将日志目录存在一个磁盘上,TaskTracker包含两种日志:系统日志和用户日志,系统日志放在< tasktracker-name >.log和< tasktracker-name >.out 中,用户日志放userlogs目录下,且按照不同作业不同任务分别建立子目录。
假如TaskTracker上任务多、日志量大,则这种日志目录组织方式可能称为TaskTracker的性能瓶颈,所以,引入了多磁盘日志目录组织方式:系统日志仍被放到hadoop.log.dir下,但用户日志将被采用轮询的方式将分布到mapred.local.dir指定的各个磁盘目录下。
日志目录清理:
UserLogManager负责,两个重要的成员变量:taskLogsTruncater和userLogCleaner,分别用于日志剪裁和日志清理。
taskLogsTruncater:实现文件剪裁功能,当任务运行完成后,对文件进行剪裁, 避免文件过大,可配置参数决定Map Task和Reduce Task最大可保留的日志文件大小。
userLogCleaner:TaskTracker将日志保存到磁盘,可能导致磁盘压力过大, 所以定期要清理。默认保留时间为24小时,超过这个时间,TaskTracker就会将作业日志从磁盘上清除。