   public static void main(String args[]) throws IOException, InterruptedException, ClassNotFoundException{
 
         GenericOptionsParser parser = new GenericOptionsParser(args);
         Configuration config = parser.getConfiguration();
         String[] remainingArgs = parser.getRemainingArgs();
 
         Job job = Job.getInstance(config, "MasteringHadoop-ReduceSideJoin");
 
         job.setMapOutputKeyClass(CompositeJoinKeyWritable.class);
         job.setMapOutputValueClass(Text.class);
         job.setOutputKeyClass(Text.class);
         job.setOutputValueClass(LongWritable.class);
 
 
         job.setReducerClass(MasteringHadoopReduceSideJoinReduce.class);
         job.setPartitionerClass(CompositeJoinKeyPartitioner.class);
         job.setGroupingComparatorClass(CompositeJoinKeyComparator.class);
         job.setNumReduceTasks(3);
 
 
         MultipleInputs.addInputPath(job, new Path(remainingArgs[0]), TextInputFormat.class, MasteringHadoopReduceSideJoinCountryMap.class);
         MultipleInputs.addInputPath(job, new Path(remainingArgs[1]), TextInputFormat.class, MasteringHadoopReduceSideJoinCityMap.class);
 
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, new Path(remainingArgs[2]));
 
         job.waitForCompletion(true);
 
     }
 
 
