我知道可以通过将mapred.min.split.size设置为dfs.block.size来根据我的dfs分割大小设置mapper的数量。
类似如何根据我的映射器输出大小设置减少器的数量?
PS:我知道以下选项可以用来操纵减速机的数量。 mapred.tasktracker.reduce.tasks.maximum mapred.reduce.tasks
答案 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);