public static void main(String[] args) throws Exception { sourcePhoto = "/home/hduser/workspace/images/source.jpg"; sourceFingerprint = SimilarImageSearch.produceFingerPrint(sourcePhoto); final Configuration conf = new Configuration(); MongoConfigUtil.setInputURI(conf, "mongodb://localhost/photo.fingerprint"); MongoConfigUtil.setOutputURI(conf, "mongodb://localhost/photo.handsomeOut"); System.out.println("Conf: " + conf); final Job job = new Job(conf, "similar photo"); job.setJarByClass(MdbSimilarPhoto.class); // Mapper,Reduce and Combiner type definition job.setMapperClass(PhotoMapper.class); job.setCombinerClass(SimilarityReducer.class); job.setReducerClass(SimilarityReducer.class); // output key/value type definition job.setOutputKeyClass(Text.class); job.setOutputValueClass(DoubleWritable.class); // InputFormat and OutputFormat type definition job.setInputFormatClass(MongoInputFormat.class); job.setOutputFormatClass(MongoOutputFormat.class); System.exit(job.waitForCompletion(true) ? 0 : 1); }
public void map(Object key, BSONObject value, Context context) throws IOException, InterruptedException { String photo = value.get("photo").toString(); String fingerprint = value.get("fingerprint").toString(); if (!value.containsField("handsome")) { return; } System.out.println("key: " + key); System.out.println("value: " + value); String handsome = value.get("handsome").toString(); int hammingDistance = SimilarImageSearch.hammingDistance(sourceFingerprint, fingerprint); photoText.set(photo + "^&^" + sourcePhoto + "$" + handsome); similarity.set((16.0 - hammingDistance) / 16.0); context.write(photoText, similarity); }