设置地图任务的数量并减少任务

时间:2011-07-30 19:16:08

标签: hadoop mapreduce

我目前正在运行一项工作,我将地图任务的数量修改为20,但获得更高的数字。我还将reduce任务设置为零,但我仍然得到一个非零的数字。 MapReduce作业完成的总时间也不会显示。有人能告诉我我做错了什么。 我正在使用此命令

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

输出:

11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient:   Job Counters 
11/07/30 19:48:56 INFO mapred.JobClient:     Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient:     Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:     Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient:     Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:   FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_READ=1556534680
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=6026699058
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:   Map-Reduce Framework
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input groups=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Combine output records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map input records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce shuffle bytes=1974162269
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Spilled Records=120000000
11/07/30 19:48:56 INFO mapred.JobClient:     Map output bytes=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:     Combine input records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input records=40000000
[hcrc1425n30]s0907855: 

15 个答案:

答案 0 :(得分:58)

给定作业的地图任务数由输入拆分数而不是mapred.map.tasks参数驱动。对于每个输入拆分,将生成一个映射任务。因此,在mapreduce作业的生命周期中,map任务的数量等于输入拆分的数量。 mapred.map.tasks只是输入地图数量的一个提示。

在您的示例中,Hadoop已确定有24个输入拆分,并将总共生成24个地图任务。但是,您可以控制每个任务跟踪器可以并行执行的地图任务数量。

此外,在-D之后删除空格可能会解决reduce的问题。

有关map和reduce任务数量的更多信息,请查看以下网址

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

答案 1 :(得分:19)

正如Praveen上面提到的,当使用基本FileInputFormat类时,只是构成数据的输入拆分数。减少器的数量 mapred.reduce.tasks控制,具体方式如下:-D mapred.reduce.tasks=10将指定10个减速器。请注意,-D之后的空格是; 如果省略空格,配置属性将传递给相关的JVM,而不是Hadoop。

您是否指定0,因为没有减少工作要做?在这种情况下,如果您遇到运行时参数问题,也可以直接在代码中设置值。给定JobConf实例job,请致电

job.setNumReduceTasks(0);

内部,比方说,你Tool.run的实施。这应该直接从映射器产生输出。如果你的作业实际上没有产生任何输出(因为你只是为了网络调用或图像处理等副作用而使用框架,或者如果结果完全在计数器值中考虑),你也可以通过调用来禁用输出

job.setOutputFormat(NullOutputFormat.class);

答案 2 :(得分:9)

重要的是要记住,Hadoop中的MapReduce框架只允许我们

  

建议作业的地图任务数量

像Praveen上面指出的

将对应于任务的输入分割数。与它的减少器数量(与MapReduce作业输出的文件数直接相关)的行为不同,我们可以

  

需求它提供n个reducer。

答案 3 :(得分:7)

用一个例子解释它:

假设您的hadoop输入文件大小为2 GB,并且您将块大小设置为64 MB,因此32个Mappers任务设置为运行,而每个映射器将处理64 MB块以完成Hadoop作业的Mapper作业。

==>设置为运行的映射器数量完全取决于1)文件大小和2)块大小

假设您在群集大小为4时运行hadoop: 假设您将conf文件中的mapred.map.tasks和mapred.reduce.tasks参数设置为节点,如下所示:

Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2
Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1

假设您为此群集中的4个节点设置了上述参数。如果您注意到节点2分别仅设置了2和2,因为节点2的处理资源可能较少(例如2个处理器,2个核心),并且节点4甚至分别设置为低于1和1,这可能是由于处理资源在该节点上是1个处理器,2个核心,因此不能运行超过1个映射器和1个reducer任务。

因此,当您运行作业节点1时,节点2,节点3,节点4配置为运行最大值。在需要由作业完成的42个映射器任务中同时完成(4 + 2 + 4 + 1)11个映射器任务。在每个节点完成其地图任务后,它将在42个映射器任务中保留剩余的映射器任务。

现在提交reducers,因为你设置mapred.reduce.tasks = 0所以我们只将mapper输出到42个文件(每个mapper任务1个文件)并且没有reducer输出。

答案 4 :(得分:2)

在较新版本的Hadoop中,有更多细粒度mapreduce.job.running.map.limitmapreduce.job.running.reduce.limit,它允许您设置映射器和缩减器计数,而不考虑hdfs文件拆分大小。如果您受限于不占用群集中的大量资源,这将非常有用。

JIRA

答案 5 :(得分:1)

从您的日志中我了解到您有12个输入文件,因为生成了12个本地地图。如果该文件的某些块位于某个其他数据节点中,则会为同一文件生成Rack Local map。你有多少个数据节点?

答案 6 :(得分:1)

在您的示例中,-D部分未被提取:

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

他们应该在classname部分之后来这样:

hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3

允许-D之后的空格。

另请注意,更改地图制作者的数量可能是其他人在此处提到的一个坏主意。

答案 7 :(得分:1)

地图任务的数量直接由您输入的分块数量来定义。数据块的大小(即HDFS块大小)是可控的,并且可以为单个文件,文件集,目录(-s)设置。因此,可以在作业中设置特定数量的地图任务,但涉及为作业的输入数据设置相应的HDFS块大小。 mapred.map.tasks 也可以用于此,但前提是它提供的值大于作业输入数据的拆分数。

通过 mapred.reduce.tasks 控制Reducer的数量是正确的。但是,将其设置为零是一个相当特殊的情况:作业的输出是映射器输出(未排序)的串联。在Matt的回答中,人们可以看到更多设置减速器数量的方法。

答案 8 :(得分:0)

增加映射器数量的一种方法是以分割文件的形式提供输入[可以使用linux split命令]。 Hadoop流通常会分配许多映射器,因为有输入文件[如果有大量文件],如果不是,它会尝试将输入分成相同大小的部分。

答案 9 :(得分:0)

  • 使用-D property = value而不是-D property = value(消除 额外的空格)。因此-D mapred.reduce.tasks = value可行 精细。

  • 设置地图任务的数量并不总是反映您拥有的值 设置,因为它取决于分割大小和使用的InputFormat。

  • 设置减少的数量肯定会超过数量 减少群集/客户端配置上的设置。

答案 10 :(得分:0)

我同意数字mapp任务取决于输入分割但在某些情况下我可以看到它有点不同

case-1我创建了一个简单的mapp任务,只创建了2个重复的输出文件(数据相同)     我在下面给出的命令

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv112.txt -mapper / home /阿米塔夫/ workpython / readcsv.py

案例2因此我将mapp任务重新调整为1,输出正确,输出文件正确,但是在UI屏幕中也有一个减速器,尽管我限制了减速器作业。命令如下:

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.map.tasks = 1 mapred.reduce.tasks = 0 -input /home/sample.csv -output / home / sample_csv115 .txt -mapper /home/amitav/workpython/readcsv.py

答案 11 :(得分:0)

第一部分已经回答,“只是一个建议” 第二部分也得到了回答,“去掉额外的空间=” 如果这些都不起作用,您确定已实施ToolRunner吗?

答案 12 :(得分:0)

地图任务的数量取决于文件大小,如果您想要n个Map,请将文件大小除以n,如下所示:

conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes
conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes

答案 13 :(得分:-2)

从这个理论来看,似乎我们无法并行运行地图减少作业。

假设我配置了总共5个映射器作业以在特定节点上运行。我也希望以这样的方式使用它,即JOB1可以使用3个映射器,JOB2可以使用2个映射器,以便作业可以并行运行。但是忽略了上面的属性,那么如何并行执行作业。

答案 14 :(得分:-2)

据我所知,上面的内容取决于输入文件。如果输入文件是100意味着 - Hadoop将创建100个地图任务。 但是,它取决于可以在一个时间点运行多少个节点上的节点配置。 如果某个节点配置为运行10个映射任务,则只需从100个可用的输入文件中选择10个不同的输入文件,即可并行运行10个映射任务。 当完成文件处理时,Map任务将继续获取更多文件。