tez.task.scale.memory.reserve-fraction can be set by clients to control how much memory is available to the processor. Ths values applies at a container level though, instead of at a vertex level.
In case of a hash-join - the processor typically needs more memory. In case of a Shuffle join - the processor may not need as much. In DAGs with a mix of map joins and shuffle joins - setting this at a container level is sub-optimal.
To a large extent this comes down to propagating vertex configs to the container / task.