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

ase*_*eng 37 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
Run Code Online (Sandbox Code Playgroud)

输出:

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: 
Run Code Online (Sandbox Code Playgroud)

Pra*_*ati 58

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

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

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

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

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


Mat*_*aum 20

正如Praveen在上面提到的那样,当使用基本FileInputFormat类时,只是构成数据的输入拆分的数量.减速机的数量通过控制mapred.reduce.tasks:指定在你的方式-D mapred.reduce.tasks=10将指定10个减速.注意后面的空格-D必需的; 如果省略空格,则配置属性将传递给相关的JVM,而不是Hadoop.

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

job.setNumReduceTasks(0);
Run Code Online (Sandbox Code Playgroud)

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

job.setOutputFormat(NullOutputFormat.class);
Run Code Online (Sandbox Code Playgroud)


Eng*_*iro 9

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

建议作业的Map任务数量

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

要求它提供n减速器.


pra*_*nak 8

用一个例子来解释它:

假设您的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
Run Code Online (Sandbox Code Playgroud)

假设您为此群集中的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输出.