split or data block from the *Hadoop Distributed File System* (HDFS). Each record in the input split is then sent to a customised $map()$ function for processing. The cost in the read phase depends on the size of the input split. Given a specific cluster, we can define the cost model of the read phase with a linear function of the size of the input split: $$T_{read} = f(d) = \beta_{0r} + \beta_1d
\label{eq:readphase}$$ where $d$ represents the size of the data and $\beta_0$ and $\beta_1$ represents the unknown parameters of the linear function. However, for a given MapReduce job, the time taken to read each block of 128MB of data is usually the same.

### **Custom Map**

This is the second sub-phase of the Map Phase. The map function contains a user-defined code to specify how to process records consumed from the input splits. Since this phase is user-defined, we, therefore, devised a way to approximate the time as shown below.

$$T_{map} = \frac{\sum_{i=1}^{n}T_{rec}}{M}/{N_c}
 \label{eq:mapphase}$$

Where $n$ is the number of records in the input split fed to the map function, $T_{rec}$ is the time taken to process each record, M is the number of mappers and $N_c$ is 