先总结一下架构:
首先是worker向master申请任务,master分配任务Task给worker,并且开启一个 go 协程对Task的状态进行监控,当时间超过10s则由master来将原来的Task重新放进maptasks(一个存放Task的chan),这里master不会理会worker是crash了,还是某些原因导致运行速度很慢。当worke完成任务后则告诉master自己完成了任务,并且由master来更改相应的数据结构来表示该任务完成。
worker函数其实就是一个无限循环来取向master申请任务并做任务,因为worker需要在完成任务后继续申请任务并做任务。
所以Task结构需要维护一个Status,来表示worker该做map任务还是reduce任务,又或者是此时已经没有未分配 的任务,但是已分配的任务在其他worker还没有完成,此时worker向master申请任务时则需要分配一个Status为waiting的任务,worker收到之后就sleep一段时间,然后继续循环申请任务。
type Task struct {
Phase int
Status TaskStatus
MapT MapTask
ReduceT ReduceTask
}
type