Ich schreibe ein Programm in Hadoop, um den höchsten Angestellten nach Geschlecht in verschiedenen Altersgruppen zu finden, der erfolgreich ausgeführt wird, aber die Ausgabedateien sind leer. Für weitere Informationen lesen Sie bitte http://www.tutorialspoint.com/map_reduce/map_reduce_quick_guide.htmMap Reduce Ausgabedatei ist leer
Programm
public class PartitionerExample extends Configured implements Tool
{
//Map class
public static class MapClass extends Mapper<LongWritable,Text,Text,Text>
{
public void map(LongWritable key, Text value, Context context)
{
try{
String[] str = value.toString().split("\t", -3);
String gender=str[3];
context.write(new Text(gender), new Text(value));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
//Reducer class
public static class ReduceClass extends Reducer<Text,Text,Text,IntWritable>
{
public int max = -1;
public void reduce(Text key, Iterable <Text> values, Context context) throws IOException, InterruptedException
{
max = -1;
for (Text val : values)
{
String [] str = val.toString().split("\t", -3);
if(Integer.parseInt(str[4])>max)
max=Integer.parseInt(str[4]);
}
context.write(new Text(key), new IntWritable(max));
}
}
//Partitioner class
public static class CaderPartitioner extends
Partitioner < Text, Text >
{
@Override
public int getPartition(Text key, Text value, int numReduceTasks)
{
String[] str = value.toString().split("\t");
int age = Integer.parseInt(str[2]);
if(numReduceTasks == 0)
{
return 0;
}
if(age<=20)
{
return 0;
}
else if(age>20 && age<=30)
{
return 1 % numReduceTasks;
}
else
{
return 2 % numReduceTasks;
}
}
}
@Override
public int run(String[] arg) throws Exception
{
Configuration conf = getConf();
Job job = new Job(conf, "topsal");
job.setJarByClass(PartitionerExample.class);
FileInputFormat.setInputPaths(job, new Path(arg[0]));
FileOutputFormat.setOutputPath(job,new Path(arg[1]));
job.setMapperClass(MapClass.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
//set partitioner statement
job.setPartitionerClass(CaderPartitioner.class);
job.setReducerClass(ReduceClass.class);
job.setNumReduceTasks(3);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true)? 0 : 1);
return 0;
}
public static void main(String ar[]) throws Exception
{
int res = ToolRunner.run(new Configuration(), new PartitionerExample(),ar);
System.exit(0);
}
}
Das Programm ist erfolgreich läuft, aber es ist Ausgabedatei keine Ausgabe angezeigt wird. Hier ist meine Ausgabe:
Sehen Sie Ausnahmen für den Kartenaufruf? Basierend auf den Zählern, die Sie angegeben haben, wurden 18 Datensätze gelesen, aber der Map-Job spuckte 0 Datensätze aus. Da Mapper 0 Datensätze ausgibt, wird Reducer nichts verarbeiten und Ihre Ausgabedatei wird daher leer sein. – Amit
'WARN io.ReadaheadPool: Fehler beim Lesen von ifile EBADF: Fehlerhafter Dateideskriptor ' Ich erhalte diese Warnung –
Vielleicht können Sie sehen, ob der Partitionierer das Problem ist, Sie könnten ihn entfernen und einen Identity Reducer oder Zero Reducers verwenden, nur um zu sehen, ob der Mapper Daten ausgibt. –