我将在一个更大的文件中执行以下操作。现在,我有一个具有以下值的示例输入文件。Hadoop Mapreduce:reducer的值是相反的顺序
1000,SMITH,JERRY
1001,JOHN,TIA
1002,TWAIN,MARK
1003,HARDY,DENNIS
1004,CHILD,JACK
1005,CHILD,NORTON
1006,DAVIS,JENNY
1007,DAVIS,KAREN
1008,MIKE,JOHN
1009,DENNIS,SHERIN
现在我正在做的是运行mapreduce作业来加密每个记录的姓氏并写回输出。我使用映射器分区号作为键和修改后的文本作为值。
所以从映射器输出将是,
0 1000,Mj4oJyk=,,JERRY
0 1001,KzwpPQ,TIA
0 1002,NSQgOi8,MARK
0 1003,KTIzNzg,DENNIS
0 1004,IjsoPyU,JACK
0 1005,IjsoPyU,NORTON
0 1006,JTI3OjI,JENNY
0 1007,JTI3OjI,KAREN
0 1008,LDoqNg,JOHN
0 1009,JTYvPSgg,SHERIN
我不希望有任何的排序是done.I还使用了减速,因为在一个较大的文件的情况下,将有多个映射器和如果没有reducer,则会写入多个输出文件。所以我使用单个reduce从所有映射器合并值并写入单个文件。 现在,减速器的输入值以相反顺序出现,并且按照映射器的顺序排列。它如下所示:
1009,JTYvPSgg,SHERIN
1008,LDoqNg==,JOHN
1007,JTI3OjI=,KAREN
1006,JTI3OjI=,JENNY
1005,IjsoPyU=,NORTON
1004,IjsoPyU=,JACK
1003,KTIzNzg=,DENNIS
1002,NSQgOi8=,MARK
1001,KzwpPQ==,TIA
1000,Mj4oJyk=,JERRY
为什么它颠倒了顺序?以及我如何维护mapper的相同顺序?任何建议将是有益的
EDIT 1:
驱动程序代码,
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJobName("encrypt");
job.setJarByClass(TestDriver.class);
job.setMapperClass(TestMap.class);
job.setNumReduceTasks(1);
job.setReducerClass(TestReduce.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(hdfsInputPath));
FileOutputFormat.setOutputPath(job, new Path(hdfsOutputPath));
System.exit(job.waitForCompletion(true) ? 0 : 1);
映射器代码是,
inputValues = value.toString().split(",");
stringBuilder = new StringBuilder();
TaskID taskId = context.getTaskAttemptID().getTaskID();
int partition = taskId.getId();
// the mask(inputvalue) method is called to encrypt input values and write to stringbuilder in appropriate format
mask(inputvalues);
context.write(new IntWritable(partition), new Text(stringBuilder.toString()));
减速器代码是,
for(Text value : values) {
context.write(new Text(value), null);
}
请分享您的代码映射器和缩减器代码。直到我知道框架排序键上的地图输出,然后传递给reducer任务,由于这可能会倒过来。 –