最近在MapReduce的逻辑运算测试的时,发现单个节点的CPU的IO wait值比较高,CPU大量的消耗在等待IO操作上。
单个节点的运算的数据量比较大,每秒的IO吞吐量将近200M,iotop监控了一下主要是消耗在tasktacker从datanode节点读取数据上。
从以下几个角度上对这个问题进行优化。
1、源数据压缩存储
2、dfs.data.dir分多个目录存储
3、io.file.buffer.size的调整,增加每次读取的数据量
4、减少tasktracker并发任务的进程数量
5、map.local.dir分多个目录,减少map运算中间结果的IO影响;中间数据压缩存储。
6、文件系统的优化,预读缓存大小调整,文件挂载设置noatime、nodiratime;调整IO调度算法,适应大量顺序读的场景;