Hadoop 如何根据我的映射器输出大小动态设置减速器的数量?

Hadoop 如何根据我的映射器输出大小动态设置减速器的数量?,hadoop,mapreduce,distributed,Hadoop,Mapreduce,Distributed,我知道可以通过将mapred.min.split.size设置为dfs.block.size,根据我的dfs拆分大小设置映射器的数量 类似地,如何根据映射器输出大小设置还原器的数量 PS:我知道下面的选项可以用来操纵减速机的数量。 mapred.tasktracker.reduce.tasks.max mapred.reduce.tasks如果要通过命令行动态设置映射器和还原器的数量: 您可以使用以下选项: -D mapred.map.tasks=5-D mapred.reduce.tasks=

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

类似地,如何根据映射器输出大小设置还原器的数量

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

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

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

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


我不认为一旦map reduce作业开始,您就可以动态更改还原器的数量。据我所知,在作业运行期间,将不会有提供值的人机交互。应该对其进行预配置。Map Reduce作业是一个批处理过程(运行很长时间),因此用户很难知道它何时会要求用户提供减缩器的数量,而且它的设计不是为了在这个过程中进行交互!!希望你得到答案

要动态设置减速器任务的数量:

映射的数量通常由输入文件中DFS块的数量决定。尽管这会导致人们调整DFS块大小以调整贴图的数量

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

在Java代码中:

long defaultBlockSize=0;
int NumOfReduce=10;//你可以设置任何东西
长inputFileLength=0;
试一试{
FileSystem FileSystem=FileSystem.get(this.getConf());//hdfs文件
//系统
inputFileLength=fileSystem.getContentSummary(
新路径(PROP_HDFS_INPUT_LOCATION)).getLength();//输入
//文件或
//档案
//储存在
//hdfs
defaultBlockSize=fileSystem.getDefaultBlockSize(新路径(
concat(“PROP_HDFS_INPUT_LOCATION”);//获取
//违约
//挡块
//大小
如果(inputFileLength>0&&defaultBlockSize>0){
NumOfReduce=(int)((inputFileLength/defaultBlockSize)+1)*2;//正在计算
//没有。
//的
//块
}
System.out.println(“NumOfReduce:+NumOfReduce”);
}捕获(例外e){
LOGGER.error(“异常{}”,e);
}
job.setNumReduceTasks(NumOfReduce);

提交作业后不能设置减速机的数量。
这样想吧-在映射器输出上调用partitioner,它需要知道没有要分区的还原器。

@Merla:谢谢您的响应。但是这些建议仍然没有提供在作业运行期间动态更改它们的选项,以防在处理数据时出现体积差异。我不认为一旦map reduce作业开始,您就可以动态更改还原器的数量。据我所知,在作业运行期间,将不会有提供值的人工交互。应该对其进行预配置。Map Reduce作业是一个批处理过程(运行很长时间),因此用户很难知道它何时会要求用户提供减缩器的数量,而且它的设计不是为了在这个过程中进行交互!!希望你得到答案!!这不是问题的答案