【问题标题】:Setting the number of map tasks and reduce tasks设置map任务和reduce任务的数量
【发布时间】:2011-10-16 15:49:17
【问题描述】:

我目前正在运行一项工作,我将地图任务的数量固定为 20,但并获得了更高的数量。我还将减少任务设置为零,但我仍然得到一个非零的数字。 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: 

【问题讨论】:

  • 您是否还在 xml 配置和/或您正在运行的类的主体中设置 mapred.map.tasks?如果是这样,更改这些设置是否会更改正在执行的任务数量?看起来您这样做是正确的,因为在命令行中指定的属性应该具有最高优先级。
  • 它应该可以工作,但我得到的地图任务比指定的要多。为什么我没有得到运行工作的总时间?
  • 我不确定没有打印的时间,但任务数量的可能错误来源是-D 属性中的间距。确保您拼写为-Dproperty=value(没有空格)或-Dproperty value(有一个空格),否则可能会被解析错误。
  • map任务的个数是根据输入的总大小和块大小,即分裂的个数。即使您设置了地图任务的数量,这也只是一个提示。 reduce任务的个数可以用户自定义,如果没有明确定义,默认reduce个数为1。更多信息:search-hadoop.com/c/MapReduce:hadoop-mapreduce-client/…

标签: hadoop mapreduce


【解决方案1】:

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

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

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

更多关于map和reduce任务数量的信息,请看下面的url

https://cwiki.apache.org/confluence/display/HADOOP2/HowManyMapsAndReduces

【讨论】:

  • 我的 Hadoop/YARN 集群中有 1 个主节点和 10 个从节点。为输入序列文件创建了 5 个输入分割。在 YARN 中的一个从节点上只产生一个 mapreduce 任务,而不是在五个节点上。任何帮助如何在 5 个或更多 ndoes 上使用它?
【解决方案2】:

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

您指定0 是因为没有reduce 工作要做吗?在这种情况下,如果您在使用运行时参数时遇到问题,也可以直接在代码中设置该值。给定一个JobConf 实例job,调用

job.setNumReduceTasks(0);

在里面,比如说,你对Tool.run 的实现。那应该直接从映射器产生输出。如果您的工作实际上没有产生任何输出(因为您将框架仅用于网络调用或图像处理等副作用,或者如果结果完全计入 Counter 值),您也可以通过调用来禁用输出

job.setOutputFormat(NullOutputFormat.class);

【讨论】:

    【解决方案3】:

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

    建议作业的地图任务数

    就像 Praveen 上面指出的那样,这将对应于任务的输入拆分数。不像它对于 reducer 数量的行为(与 MapReduce 作业输出的文件数量直接相关),我们可以

    要求提供 n 个减速器。

    【讨论】:

    • 您使用哪个命令要求 n 个减速器?如果可能的话,你能举一个小例子吗?我需要输出小文件(只有几 mb)
    【解决方案4】:

    举例说明:

    假设您的 hadoop 输入文件大小为 2 GB,并且您将块大小设置为 64 MB,因此设置运行 32 个 Mapper 任务,而每个映射器将处理 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 个减速器任务。

    因此,当您运行作业时,节点 1、节点 2、节点 3、节点 4 被配置为运行最大。 Job 需要完成的 42 个 mapper 任务中,总共有 (4+2+4+1)11 个 mapper 任务同时完成。每个 Node 完成其 map 任务后,它将占用 42 个 mapper 任务中剩余的 mapper 任务。

    现在开始使用 reducer,因为您设置 mapred.reduce.tasks = 0,所以我们只能将 mapper 输出放入 42 个文件(每个 mapper 任务 1 个文件),并且没有 reducer 输出。

    【讨论】:

    • 设置运行的mapper个数完全依赖1) File Size and 2) Block Size,我觉得应该是1) File Size and 2) Split Size,mapper个数等于split个数。这是一个参考:stackoverflow.com/questions/30549261/…
    【解决方案5】:

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

    JIRA

    【讨论】:

    • 我的downvote 是一个错误 - 我实际上想要upvote!
    • 这些参数只控制“最大同时运行的任务”,而不是映射器/减速器的总数。我不确定这些参数有什么用?我宁愿让纱线控制跨集群的并发性。更重要的是映射器/减速器的总数。不确定它是否与上述问题有关。谢谢。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      在您的示例中,-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
      

      他们应该像这样在类名部分之后:

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

      -D 后面的空格是允许的。

      另请注意,正如其他人在这里提到的那样,更改映射器的数量可能是个坏主意。

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          增加映射器数量的一种方法是以拆分文件的形式提供输入[您可以使用 linux split 命令]。 Hadoop 流式处理通常会分配与输入文件一样多的映射器[如果有大量文件],否则它将尝试将输入拆分为相等大小的部分。

          【讨论】:

            【解决方案10】:
            • 使用 -D property=value 而不是 -D property = value(消除 额外的空格)。因此 -D mapred.reduce.tasks=value 会起作用 美好的。

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

            • 设置reduce的数量肯定会覆盖reduce的数量 减少集群/客户端配置集。

            【讨论】:

              【解决方案11】:

              我同意 number 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/ amitav/workpython/readcsv.py

              Case-2 因此,我将 mapp 任务限制为 1,输出正确地带有一个输出文件,但一个 reducer 也在 UI 屏幕中午餐,尽管我限制了 reducer 工作。命令如下。

              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

              【讨论】:

                【解决方案12】:

                第一部分已经回答,“只是一个建议” 第二部分也已经回答了,“去掉=”周围多余的空格 如果这两个都不起作用,你确定你已经实现了ToolRunner

                【讨论】:

                  【解决方案13】:

                  地图任务的数量取决于文件大小,如果你想要n个地图,将文件大小除以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
                  

                  【讨论】:

                    【解决方案14】:

                    从这个理论看来,我们似乎无法并行运行 map reduce 作业。

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

                    【讨论】:

                      【解决方案15】:

                      根据我在上面的阅读理解,这取决于输入文件。如果输入文件是 100 意味着 - Hadoop 将创建 100 个地图任务。 但是,它取决于节点配置上可以在一个时间点运行多少。 如果一个节点被配置为运行 10 个映射任务 - 只有 10 个映射任务将通过从 100 个可用的输入文件中挑选 10 个不同的输入文件并行运行。 Map 任务将在完成文件处理时继续获取更多文件。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-08-06
                        • 2016-01-11
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-03-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多