我有一个问题。
我想增加我的地图并将函数减少到输入数据的数量。当我执行System.out.println(conf.getNumReduceTasks())
和System.out.println(conf.getNumMapTasks())
时,它会显示我:
1 1
当我执行conf.setNumReduceTasks(1000000)
和conf.setNumMapTasks(1000000)
并再次执行println
方法时,它会向我显示:
1000000 1000000
但我认为我的mapreduce程序执行时间没有变化。我的输入来自cassandra,实际上它是cassandra列族的行,大约是362000行。 我想设置我的map和reduce函数到输入行的数量..
我该怎么办?
答案 0 :(得分:1)
为map / reduce作业设置map / reduce任务的数量确定了将使用多少map / reduce进程来处理您的作业。考虑一下你是否真的需要这么多的java进程。
也就是说,地图任务的数量主要是自动确定的;设置map任务的数量只是一个提示,可以增加Hadoop确定的地图数量。
对于reduce任务,默认值为1,实际限制大约为1,000。
请参阅:http://wiki.apache.org/hadoop/HowManyMapsAndReduces
了解群集中的每个节点还具有可以同时执行的最大数量的map / reduce任务也很重要。这由以下配置设置设置:
mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum
这两者的默认值为2。
因此,增加map / reduce任务的数量将限制为每个节点可以同时运行的任务数量。这可能是您没有看到工作执行时间发生变化的一个原因。
请参阅:http://hadoop.apache.org/docs/stable/mapred-default.html
摘要是: 让Hadoop确定地图的数量,除非您想要更多的地图任务。
使用mapred.tasktracker..tasks.maximum设置来控制一次可以运行的任务数。
reduce任务数量的最大值应介于1或2 *之间(mapred.tasktracker.reduce.tasks.maximum * #nodes)。您还必须考虑您希望一次运行多少个map / reduce作业,以便单个作业不会占用所有可用的reduce槽。
对于任何一种设置,值1,000,000几乎肯定都太高了;运行那么多java进程是不切实际的。我希望这些高价值被忽略。
将mapred.tasktracker..tasks.maximum设置为您的节点能够同时运行的任务数后,尝试逐步增加作业的map / reduce任务。
您可以在job.xml文件中查看作业使用的实际任务数,以验证您的设置。