【问题标题】:How to set number of reducer dynamically based on my mapper output size?如何根据我的映射器输出大小动态设置减速器的数量?
【发布时间】:2014-09-10 06:01:30
【问题描述】:

我知道可以通过将 mapred.min.split.size 设置为 dfs.block.size 来根据我的 dfs 拆分大小来设置映射器的数量。

类似地,如何根据我的映射器输出大小设置减速器的数量?

PS:我知道下面的选项可以用来操纵reducer的数量。 mapred.tasktracker.reduce.tasks.maximum mapred.reduce.tasks

【问题讨论】:

    标签: hadoop mapreduce distributed


    【解决方案1】:

    作业提交后无法设置reducer的数量。 这样想 - 在映射器输出上调用分区器,它需要知道没有减速器来分区。

    【讨论】:

      【解决方案2】:

      如果你想通过命令行动态设置mapper和reducer的数量:: 您可以使用以下选项:

      -D mapred.map.tasks=5 -D mapred.reduce.tasks=5

      我们还可以在驱动代码中设置mapper和reducer的数量: job.setNumMapTasks(); job.setNumReduceTasks();

      我不认为你可以在 map reduce 作业开始后动态更改 reducer 的数量。据我所知,在作业运行期间提供值不会有人工交互。应该预先配置。 Map Reduce 作业是一个批处理过程(运行时间很长),因此用户很难知道它何时会询问用户减速器的数量,并且在此过程中它不是为交互而设计的!希望你得到答案!!

      【讨论】:

      • @Merla:感谢您的回复。但是这些建议仍然没有提供在作业运行期间动态更改它们的选项,以防处理数据时出现体积差异。
      • 我不认为你可以在 map reduce 作业开始后动态更改 reducer 的数量。据我所知,在作业运行期间提供值不会有人工交互。应该进行预配置。 Map Reduce 作业是一个批处理过程(运行时间很长),因此用户很难知道它何时会询问用户减速器的数量,并且在此过程中它不是为交互而设计的!希望你得到答案!
      【解决方案3】:

      动态设置reducer任务的数量:

      map 的数量通常由输入文件中的 DFS 块的数量决定。虽然这会导致人们调整他们的 DFS 块大小以调整地图的数量。

      所以在下面的代码中,让我们动态设置reducer任务的数量,以便在运行时根据map任务的数量进行调整。

      在 Java 代码中:

      long defaultBlockSize = 0;
      int NumOfReduce = 10; // you can set anything
      long inputFileLength = 0;
      try {
          FileSystem fileSystem = FileSystem.get(this.getConf()); // hdfs file
                                                                  // system
          inputFileLength = fileSystem.getContentSummary(
                  new Path(PROP_HDFS_INPUT_LOCATION)).getLength();// input
                                                                  // file or
                                                                  // files
                                                                  // stored in
                                                                  // hdfs
      
          defaultBlockSize = fileSystem.getDefaultBlockSize(new Path(
                  hdfsFilePath.concat("PROP_HDFS_INPUT_LOCATION")));// getting
                                                                      // default
                                                                      // block
                                                                      // size
          if (inputFileLength > 0 && defaultBlockSize > 0) {
              NumOfReduce = (int) (((inputFileLength / defaultBlockSize) + 1) * 2);// calculating
                                                                                      // no.
                                                                                      // of
                                                                                      // blocks
          }
          System.out.println("NumOfReduce : " + NumOfReduce);
      } catch (Exception e) {
          LOGGER.error(" Exception{} ", e);
      }
      
      job.setNumReduceTasks(NumOfReduce);
      

      【讨论】:

      • 这不是问题的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2013-10-23
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多