如何根据我的mapper输出大小动态设置reducer的数量?

时间:2014-07-19 02:28:09

标签: hadoop mapreduce distributed

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

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

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

3 个答案:

答案 0 :(得分:2)

提交作业后,不能设置减速器。 这样考虑一下 - 在mapper输出上调用partitioner,它需要知道没有reducers来进行分区。

答案 1 :(得分:0)

如果要通过命令行动态设置映射器和缩减器的数量:: 您可以使用以下选项:

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

我们还可以在驱动程序代码中设置映射器和缩减器的数量:  job.setNumMapTasks();  job.setNumReduceTasks();

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

答案 2 :(得分:0)

动态设置reducer任务的数量:

映射数通常由输入文件中的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);