I. Introduction
Recent technological advances, such as cloud and fog computing, have contributed to the evolution and widespread adoption of the distributed computing paradigm. More and more applications are being migrated to such environments, in an attempt to harness the computational power of the distributed resources. This trend, along with the explosive growth of big data analytics facilitated by machine learning and other artificial intelligence (AI) techniques, resulted in applications that feature a high degree of parallelism, operating on large and diverse data sets. Applications of this kind typically consist of component tasks that are independent and able to be processed in any order. Such workloads are commonly referred to as bag-of-tasks (BoT) jobs [1], [2]. The execution of a BoT job is considered finished only when the processing of all of its component tasks has been completed. Examples of BoT jobs include data mining, chromosome mapping, drug discovery and image processing [3]–[5].