hadoopcompatibility: Implementations of basic programming interfaces and...

... a basic driver.

* wrappers for Mapper, Reducer and Combiner (as a local Reducer) on the new Java API
* wrapper for OutputCollector
* wrappers for Partitioner, values comparator.
* a driver making it posible to run unmonitored (so far)  Hadoop jobs on Flink.
* tests and variations of the WordCount driver exclusively in Hadoop.

You can find more about the Google Summer of Code project here:  https://issues.apache.org/jira/browse/FLINK-838?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14031511
The case of different combiner and reducer needs to be handled differently.
You do `mapOut.groupBy(hadoopGrouper).reduceGroup(combiner).reduceGroup(reducer)`.

In this case, the combiner is called as it was a reducer, i.e., after the data was partitioned and sorted. The purpose of a combiner is to reduce the data before shipping it over the network and (completely) sorting it.
Moreover, the reduce is finally called on the fully reduced data as an AllReduce, which puts all data into a single group which will cause wrong results.

The solution here is to have a HadoopReduceFunction that can deal with a Reduce and Combine function.