Towards Optimal Resource Provisioning For Running Mapreduce Programs In Public Clouds