分区程序似乎在单个节点上不起作用



我已经编写了mapreduce代码以及自定义分区。自定义分区对具有某些条件的键进行排序。我在驱动程序类中设置了一个setNumReduceTasks=6。但是我正在我的单台机器上测试这段代码。我只得到一个减速器输出文件,而不是 6 个化简器文件。分区程序在单台计算机上不起作用吗?是否需要多节点群集才能看到自定义分区程序的效果?对此的任何见解将不胜感激。

当您将 no of reducer 设置为大于 1 时,分区程序始终有效,即使它是单节点群集。

我已经在单节点群集上测试了以下代码,它按预期工作:

public final class SortMapReduce extends Configured implements Tool {
public static void main(final String[] args) throws Exception {
    int res = ToolRunner.run(new Configuration(), new SortMapReduce(), args);
    System.exit(res);
}
public int run(final String[] args) throws Exception {
    Path inputPath = new Path(args[0]);
    Path outputPath = new Path(args[1]);
    Configuration conf = super.getConf();
    Job job = Job.getInstance(conf);
    job.setJarByClass(SortMapReduce.class);
    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    job.setMapOutputKeyClass(Person.class);
    job.setMapOutputValueClass(Text.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.setPartitionerClass(PersonNamePartitioner.class);
    job.setNumReduceTasks(5);
    FileInputFormat.setInputPaths(job, inputPath);
    FileOutputFormat.setOutputPath(job, outputPath);
    if (job.waitForCompletion(true)) {
        return 0;
    }
    return 1;
}
public static class Map extends Mapper<Text, Text, Person, Text> {
    private Person outputKey = new Person();
    @Override
    protected void map(Text pointID, Text firstName, Context context) throws IOException, InterruptedException {
        outputKey.set(pointID.toString(), firstName.toString());
        context.write(outputKey, firstName);
    }
}
public static class Reduce extends Reducer<Person, Text, Text, Text> {
    Text pointID = new Text();
    @Override
    public void reduce(Person key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        pointID.set(key.getpointID());
        for (Text firstName : values) {
            context.write(pointID, firstName);
        }
    }
}

}

分区程序类:

public class PersonNamePartitioner extends Partitioner<Person, Text> {
@Override
public int getPartition(Person key, Text value, int numPartitions) {
    return Math.abs(key.getpointID().hashCode() * 127) % numPartitions;
}

}

运行命令:

hadoop jar/home/hdfs/SecondarySort.jar org.test.SortMapReduce

/demo/data/Customer/acct.txt/demo/data/Customer/output2

谢谢

我在一台机器上有一个双节点集群。这正是我所做的。从那里你可以看到我这样做了(在执行时):

指定化简器的数量,例如两个

-D mapred.reduce.tasks=2

仔细查看您的自定义分区程序。 它可能会为传递到它的所有键返回相同的分区值。

在这种情况下,它是一个低效的分区程序,它将所有键发送到同一个缩减器。 因此,即使您将化简器的数量设置为 6,也只有一个化简器将具有所有键值,其余 5 个化简器将没有任何要处理的内容。

因此,您将拥有处理所有记录的唯一化简器的输出。

分区程序是否不适用于单个机器?分区程序也可以在单机伪集群中工作。

是否需要多节点集群才能看到自定义的效果分区程序?不。

相关内容

  • 没有找到相关文章

最新更新