Some plugins (sources, transforms, sinks) may want to access the context of the processing framework (e.g. MapReduce, Spark). They may want to use this for:
1. Updating M/R counters
2. Accessing the input split, so they can make decisions based on file paths (e.g. parse the file path and infer some properties)
3. Accessing files in DistributedCache
This should be implemented without a tight coupling with the underlying processing framework.