以下是我的心得,欢迎指正~
map任务数量的设置:
- 提交的一个文本就是一个map任务:InputFormat在默认情况下会根据hadoop集群的DFS块大小进行分片,每一个分片会由一个map任务来进行处理。
- 可以通过参数mapred.min.split.size参数在作业提交客户端进行自定义设置。
- mapred.map.tasks参数,只有当InputFormat 决定了map任务的个数比mapred.map.tasks值小时才起作用。
- 通过使用JobConf 的conf.setNumMapTasks(int num)方法来手动地设置。
所有的方法都有个准则:能够增加map任务的个数,但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。就是map只能增加,不能减少。
参考:hadoop中map和reduce的数量设置问题
reduce任务的数量
正确的reduce任务的个数应该是0.95或者1.75 *reduce任务槽的个数。(reduce任务槽的个数=(节点数
×mapred.tasktracker.tasks.maximum))如果任务数是任务槽的0.95倍,那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。如果任务数是任务槽的1.75倍,那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务,这样的情况更有利于负载均衡。同时需要注意增加reduce的数量虽然会增加系统的资源开销,但是可以改善负载匀衡,降低任务失败带来的负面影响。
- 同样,Reduce任务也能够与 map任务一样,通过设定JobConf 的conf.setNumReduceTasks(int num)方法来增加任务个数。