PARQUET-108: Parquet Memory Management in Java

PARQUET-108: Parquet Memory Management in Java.
When Parquet tries to write very large "row groups", it may causes tasks to run out of memory during dynamic partitions when a reducer may have many Parquet files open at a given time.

This patch implements a memory manager to control the total memory size used by writers and balance their memory usage, which ensures that we don't run out of memory due to writing too many row groups within a single JVM.

Author: dongche1 <dong1.chen@intel.com>

Closes #80 from dongche/master and squashes the following commits:

e511f85 [dongche1] Merge remote branch 'upstream/master'
60a96b5 [dongche1] Merge remote branch 'upstream/master'
2d17212 [dongche1] improve MemoryManger instantiation, change access level
6e9333e [dongche1] change blocksize type from int to long
e07b16e [dongche1] Refine updateAllocation(), addWriter(). Remove redundant getMemoryPoolRatio
9a0a831 [dongche1] log the inconsistent ratio config instead of thowing an exception
3a35d22 [dongche1] Move the creation of MemoryManager. Throw exception instead of logging it
aeda7bc [dongche1] PARQUET-108: Parquet Memory Management in Java" ;
c883bba [dongche1] PARQUET-108: Parquet Memory Management in Java
7b45b2c [dongche1] PARQUET-108: Parquet Memory Management in Java
6d766aa [dongche1] PARQUET-108: Parquet Memory Management in Java --- address some comments
3abfe2b [dongche1] parquet 108