我在学习Map reduce时遇到了以下疑问。如果有人能回答,那将会有很大帮助。
我有两个处理同一个文件的地图制作工具 - 我使用MultipleInputFormat配置它们
mapper 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]
但是我得到了一些奇怪的输出。我猜只有1个Mapper正在运行。 这不是预期的吗?每个映射器的输出是否会单独洗牌?两个映射器是否会并行运行?
对不起,如果它是一个蹩脚的问题请理解我是Hadoop和Map Reduce的新手
以下是代码
//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);
}
}
这是我得到的O / P -
a Monday
b Tuesday
c Wednesday
使用数据集
a,1234,Monday
b,3456,Tuesday
c,1345,Wednesday
答案 0 :(得分:3)
多输入格式只占用1个文件并在其上运行一个映射器,因为我为两个Mapper提供了相同的路径。
当我将数据集复制到另一个文件并使用两个不同的文件(相同的内容但文件的名称不同)运行相同的程序时,我得到了预期的输出。
所以我现在明白,不同映射器函数的输出也是基于键组合的,而不仅仅是同一映射器函数的输出。
感谢你们帮助...... !!!