备用任务机制的设计真的挺妙,专门对付那些拖后腿的任务节点。MapReduce 里的“落伍者”不是什么稀奇事,磁盘慢、CPU 抢资源、初始化 bug……哪一个都能让你排查半天。Google 那套逻辑就是聪明:快结束时,master会悄悄再丢几个同样的任务出去,哪个先跑完就用哪个,完美避坑。
任务分片也挺讲究,M和R不是随便设的,太少负载不均,太多又爆内存,最合适的是让每个 Map 任务16M~64M的数据,这样本地磁盘读取才有效率,Map=200000,Reduce=5000
配上 2000 台 worker,跑得飞快。
哦对,输入文件默认放本地磁盘,靠GFS分块复制,每块64MB有三个副本,这样 Map 任务基本都能在本地读数据,省了不少带宽。调度器也挺聪明,找不到本地副本就尽量安排在同一个 switch下面的机器上跑,减少跨节点传输。
如果你也在调 MapReduce,尤其是大规模分布式任务,建议看看这段原理,调优的时候会省不少事。