目录

简介

使用Mapreduce开发程序有一段时间了,也积累了一些使用经验,后续可能会陆续使用Spark,在此总结一些Mapreduce的使用技巧。

基本配置

  1. 要减少网络延迟,配置所有节点在同一子网
  2. 不使用虚拟机
  3. noatime挂载磁盘,文件访问数据不会被记录
  4. 节点磁盘不要做RAID和LVM

map和reduce task设置

  1. 设置map执行结束之后再执行reduce任务,mapreduce.job.reduce.slowstart.completedmaps设置成1
  2. 如果每个task的执行时间少于30到40秒,就减少task的数量。Task的创建与调度一般耗费几秒的时间,如果task完成的很快,我们就是在浪费时间。同时,设置JVM重用也可以解决这个问题。
  3. 如果一个job的输入数据大于1TB,我们就增加block size到256或者512,这样可以减少task的数量。你可以使用这个命令去修改已存在文件的block size: hadoop distcp -Ddfs.block.size=$[25610241024] /path/to/inputdata /path/to/inputdata-with/largeblocks。在执行完这个命令后,你就可以删除原始的输入文件了(/path/to/inputdata)。
  4. 不要调度太多的reduce task — 对于大多数job来说,我们推荐reduce task的数量应当略小于cluster中reduce slot的倍数
  5. 设置LZO压缩,压缩reduce输出结果,因为副本数为3,压缩输出可以节省空间和提高性能,同时设置mapred.compress.map.output值为true。

程序编写优化

  1. 使用最合适最简洁的writable类型,大数据量的数值和文本间的转换会消耗大量CPU时间
  2. 重用writable类型,避免重复的new Text" 或"new IntWritable
  3. 使用StringBuffer.append来连接字符串

技巧

  1. 如果是测试环境,可以取消hadoop hdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。
  2. timeout 设置大点,避免长时间的任务超时而停止执行

参考:7 Tips for Improving MapReduce Performance