最近使用mapreduce处理一批数据,但要处理的文件大部分都是几MB的小文件,当任务刚跑起来,发现启动了不少map任务,很影响执行效率。(任务运行在cdh5.13集群对应yarn下)负载均衡
经过配置mapreduce加载的配置文件能够控制map的任务个数,提升执行效率。oop
mapred-site.xmlxml
<property>
<name>mapreduce.job.split.metainfo.maxsize</name>
<value>268635456</value>
</property>blog
hdfs-site.xmlit
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>效率
Map任务的个数也能经过使用JobConf 的 conf.setNumMapTasks(int num)方法来手动地设置。这个方法可以用来增长map任务的个数,可是不能设定任务的个数小于Hadoop系统经过分割输入数据获得的值。 集群
Reduce任务的个数
正确的reduce任务的 个数应该是0.95或者1.75 ×(节点数 ×mapred.tasktracker.tasks.maximum参数值)。若是任务数是节点个数的0.95倍,那么全部的reduce任务可以在 map任务的输出传输结束后同时开始运行。若是任务数是节点个数的1.75倍,那么高速的节点会在完成他们第一批reduce任务计算以后开始计算第二批 reduce任务,这样的状况更有利于负载均衡。 配置
Reduce任务的数量同时也控制着输出目录下输出文件的数量,可是一般状况下这并不重要,由于下一阶段的 map/reduce任务会把他们分割成更加小的片断。
Reduce任务也可以与 map任务同样,经过设定JobConf 的conf.setNumReduceTasks(int num)方法来增长任务个数。meta