Quoting from Pregel paper: aggregators are a mechanism for global communication, monitoring, and data. Each vertex can provide a value to an aggregator in superstep S, the system combines those values using a reduction operator, and the resulting value is made available to all vertices in superstep S + 1.
You can think aggregators as a tree, that the leaves (which are the graph vertices) are sending messages to the root (the master aggregator), and then the root is combining all these messages to a value. In the end, this combined values are distributed back to the leaves. Aggregators are useful for statistics (think of an histogram of vertex degrees) or for global management.
To start using aggregators, you must declare them in your GraphJob.
HamaConfiguration conf = new HamaConfiguration(new Configuration()); GraphJob graphJob = new GraphJob(conf, MyClass.class); // To add an average aggregator graphJob.setAggregatorClass(AverageAggregator.class); // To add a sum aggregator graphJob.setAggregatorClass(SumAggregator.class);
There are multiple different aggregators and you can also make your own. You can look for already implemented aggregators in org.apache.hama.graph package.
Start working with aggregators
In order to aggregate values from your vertices, use:
This method is called from inside each vertex. Though it's not mandatory all vertices to make use of this method.
The index parameter of this method is a number that is equivalent to the order of the registered aggregator. (The first registered aggregator has index 0, second has index 1 etc.)
Inside your vertex, you can get the results of each aggregator by using the method:
Write your own aggregators
To write your own aggregator, you have to extend AbstractAggregator class and implement the methods of #aggregate(M value) and #getValue(). For more, please see the default implementation of aggregators in org.apache.hama.graph package.