Hadoop 如果两个映射器输出相同的键,则减速器的输入将是什么?

Hadoop 如果两个映射器输出相同的键,则减速器的输入将是什么?,hadoop,mapreduce,Hadoop,Mapreduce,在学习地图还原时,我有以下疑问。如果有人能回答,那将大有裨益 我有两个映射器在同一个文件上工作-我使用MultipleInputFormat配置了它们 映射器1-预期输出[在提取文件的几列之后] a - 1234 b - 3456 c - 1345 Mapper 2预期输出[在提取同一文件的几列后] a - Monday b - Tuesday c - Wednesday 还有一个reducer函数,它只输出作为输入的键和值对 因此,我希望输出是,正如我所知,类似的键将被洗牌以形成一个列表

在学习地图还原时,我有以下疑问。如果有人能回答,那将大有裨益

我有两个映射器在同一个文件上工作-我使用MultipleInputFormat配置了它们

映射器1-预期输出[在提取文件的几列之后]

a - 1234
b - 3456
c - 1345
Mapper 2预期输出[在提取同一文件的几列后]

a - Monday
b - Tuesday
c - Wednesday
还有一个reducer函数,它只输出作为输入的键和值对 因此,我希望输出是,正如我所知,类似的键将被洗牌以形成一个列表

a - [1234,Monday]
b - [3456, Tuesday]
c - [1345, Wednesday]
但是我得到了一些奇怪的输出。我想只有一个映射程序正在运行。 这难道不是意料之中的吗?每个映射器的输出是否会分别被洗牌?两个地图绘制者会并行运行吗

对不起,如果这是一个蹩脚的问题,请理解我是Hadoop和MapReduce的新手

下面是代码

//Mapper1
public class numbermapper extends Mapper<Object, Text, Text, Text>{

    public void map(Object key,Text value, Context context) throws IOException, InterruptedException {
        String record = value.toString();
        String[] parts = record.split(",");
        System.out.println("***Mapper number output "+parts[0]+"  "+parts[1]);
        context.write(new Text(parts[0]), new Text(parts[1]));

    }
}

//Mapper2
public class weekmapper extends Mapper<Object, Text, Text, Text> {
    public void map(Object key, Text value, Context context)
            throws IOException, InterruptedException {
        String record = value.toString();
        String[] parts = record.split(",");
        System.out.println("***Mapper week output "+parts[0]+"   "+parts[2]);
        context.write(new Text(parts[0]), new Text(parts[2]));
    }
}

//Reducer
public class rjoinreducer extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Text values, Context context)
    throws IOException, InterruptedException {
   context.write(key, values);

}
}

//Driver class
public class driver {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = new Job(conf, "Reduce-side join");
        job.setJarByClass(numbermapper.class);
        job.setReducerClass(rjoinreducer.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);


        MultipleInputs.addInputPath(job, new Path(args[0]),TextInputFormat.class, numbermapper.class);
        MultipleInputs.addInputPath(job, new Path(args[0]),TextInputFormat.class, weekmapper.class);
        Path outputPath = new Path(args[1]);


        FileOutputFormat.setOutputPath(job, outputPath);
        outputPath.getFileSystem(conf).delete(outputPath);
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
使用的数据集

a,1234,Monday
b,3456,Tuesday
c,1345,Wednesday

多输入格式只是获取一个文件并在其上运行一个映射器,因为我为两个映射器提供了相同的路径

当我将数据集复制到另一个文件并运行相同的程序以获取两个不同的文件(相同的内容但文件的名称不同)时,我得到了预期的输出

因此,我现在了解到,来自不同映射器函数的输出也基于键进行组合,而不仅仅是来自同一映射器函数的输出


谢谢你的帮助

多输入格式只是获取一个文件并在其上运行一个映射器,因为我为两个映射器提供了相同的路径

当我将数据集复制到另一个文件并运行相同的程序以获取两个不同的文件(相同的内容但文件的名称不同)时,我得到了预期的输出

因此,我现在了解到,来自不同映射器函数的输出也基于键进行组合,而不仅仅是来自同一映射器函数的输出


谢谢你的帮助

多输入格式只是获取一个文件并在其上运行一个映射器,因为我为两个映射器提供了相同的路径

当我将数据集复制到另一个文件并运行相同的程序以获取两个不同的文件(相同的内容但文件的名称不同)时,我得到了预期的输出

因此,我现在了解到,来自不同映射器函数的输出也基于键进行组合,而不仅仅是来自同一映射器函数的输出


谢谢你的帮助

多输入格式只是获取一个文件并在其上运行一个映射器,因为我为两个映射器提供了相同的路径

当我将数据集复制到另一个文件并运行相同的程序以获取两个不同的文件(相同的内容但文件的名称不同)时,我得到了预期的输出

因此,我现在了解到,来自不同映射器函数的输出也基于键进行组合,而不仅仅是来自同一映射器函数的输出


谢谢你的帮助

你的怪异输出是什么?你能提供一个你是如何编写代码的演示,以及“怪异输出”是什么吗?我编辑了这个问题,包括I/p O/p和我使用的代码。它只是给出了第二个映射器的输出。你的奇怪输出是什么?你能提供一个演示你是如何编写代码的,以及“奇怪输出”是什么吗?我编辑了这个问题,包括I/P O/P和我使用的代码。它只是给出了第二个映射器的输出。你的奇怪输出是什么?你能提供一个演示你是如何编写代码的,以及“奇怪输出”是什么吗?我编辑了这个问题,包括I/P O/P和我使用的代码。它只是给出了第二个映射器的输出。你的奇怪输出是什么?你能提供一个演示你是如何编写代码的,以及“奇怪输出”是什么吗?我编辑了这个问题,包括I/P O/P和我使用的代码。它只是给出第二个映射器的输出。
a,1234,Monday
b,3456,Tuesday
c,1345,Wednesday