我目前正在运行一项工作,我将地图任务的数量修改为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)
重要的是要记住,Hadoop中的MapReduce框架只允许我们使用
建议作业的Map任务数量
像Praveen上面指出的那样,将对应于任务的输入分割数.与它的减少器数量(与MapReduce作业输出的文件数直接相关)的行为不同,我们可以
要求它提供n减速器.
用一个例子来解释它:
假设您的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输出.
| 归档时间: |
|
| 查看次数: |
153171 次 |
| 最近记录: |