@Override public void map(IntWritable nid, PageRankNode node, Context context) throws IOException, InterruptedException { // Pass along node structure. intermediateStructure.setNodeId(node.getNodeId()); intermediateStructure.setType(PageRankNode.Type.Structure); intermediateStructure.setAdjacencyList(node.getAdjacenyList()); context.write(nid, intermediateStructure); int massMessages = 0; int massMessagesSaved = 0; // Distribute PageRank mass to neighbors (along outgoing edges). if (node.getAdjacenyList().size() > 0) { // Each neighbor gets an equal share of PageRank mass. ArrayListOfIntsWritable list = node.getAdjacenyList(); float mass = node.getPageRank() - (float) StrictMath.log(list.size()); context.getCounter(PageRank.edges).increment(list.size()); // Iterate over neighbors. for (int i = 0; i < list.size(); i++) { int neighbor = list.get(i); if (map.containsKey(neighbor)) { // Already message destined for that node; add PageRank mass contribution. massMessagesSaved++; map.put(neighbor, sumLogProbs(map.get(neighbor), mass)); } else { // New destination node; add new entry in map. massMessages++; map.put(neighbor, mass); } } } // Bookkeeping. context.getCounter(PageRank.nodes).increment(1); context.getCounter(PageRank.massMessages).increment(massMessages); context.getCounter(PageRank.massMessagesSaved).increment(massMessagesSaved); }
@Override public void cleanup(Context context) throws IOException, InterruptedException { // Now emit the messages all at once. IntWritable k = new IntWritable(); PageRankNode mass = new PageRankNode(); for (MapIF.Entry e : map.entrySet()) { k.set(e.getKey()); mass.setNodeId(e.getKey()); mass.setType(PageRankNode.Type.Mass); mass.setPageRank(e.getValue()); context.write(k, mass); } }