Class describing a particular application.
Everything except input and output should be fully encapsulated within
this class. For any application, it should be enough to only specify
Given configuration, it creates a block that represents a full Giraph job.
Recommended is to extend AbstractBlockFactory directly for most cases.
Create a block (representing a full Giraph job), based on the given
configuration. Configuration should be treated as immutable at this point.
If there are issues in configuration, it is very cheap to throw
from this method - as Giraph job will not even start.
This function will be called two times - once before starting
of the Giraph job, to fail early if anything is incorrectly configured.
Second time will be on Master, which will return Block instance
on which createIterator will be called once, which should return
current application run.
initConfig will be called only once, before starting Giraph job itself.
Master will contain configuration already modified by initConfig.
Create an empty instance of execution stage object.
Can be used by application to be aware of what was executed before.
Most common example is counting iterations, or for having a boolean whether
some important event happened.
Execution stage should be immutable object, with creating a new
object when different value is needed.