MapReduce bugfixes

Added enforcement to have a partition table before the actual job is started and found missing volatiles on the reducer implementations of the unittests (tests were mostly copied from castmapr where the volatile keyword was not needed).

Fixes #3065 
Fixes #3289 

backport follows
Is this method called once or on every map-reduce execution? `InternalPartitionService.getPartitions()` creates array copy and this can create lots of garbage.
You can write same method like this;

```java
int partitionCount = partitionService.getPartitionCount();
long startTime = Clock.currentTimeMillis();
for (int p = 0; p < partitionCount; p++) {
    while (partitionService.getPartitionOwner(p) == null) {
        try {
            Thread.sleep(RETRY_PARTITION_TABLE_MILLIS);
        } catch (Exception ignore) {
            EmptyStatement.ignore(ignore);
        }

        if (Clock.currentTimeMillis() - startTime > PARTITION_READY_TIMEOUT) {
            throw new TimeoutException("Partition get ready timeout reached!");
        }
    }
}
```