最近因个人需求在研究云平台环境下的工作流调度,但云平台环境安装较为复杂,就需要一套能进行云平台工作流调度的仿真工具,WorkflowSim就是这样一款软件。它是南加州大学Weiwei Chen所在实验室开发的一套开源工作流仿真软件,可用于验证资源调度算法、分布式研究、图算法、工作流调度算法等相关问题。
WorkflowSim是拓展自CloudSim的工作流仿真开源软件,可以提供工作流基础上的仿真,增加了模拟不同层次延时和故障的支持,与真实分布式环境更加接近。与CloudSim不同的是,WorkflowSim是在CloudSim的基础上,为工作流各模块提供仿真支持。工作流仿真软件将依据任务之间的依赖关系(dax文件指定)按照顺序执行,与此同时,用户所选择的某个调度算法也会在执行过程中被调用,比如Min-Min、Max-Min、DHEFT、HEFT等算法己经在WorkflowSim仿真软件里实现并测试通过了,当然,用户也可将自己改进或设计的调度算法加入到WorkflowSim仿真软件中。
WorkflowSim是一套开源软件,所有源代码和介绍都可以在https://github.com/WorkflowSim/WorkflowSim-1.0找到。使用非常简单,下载完源代码之后,只需要在任何一个WorkflowSim example里边选择所需要的dax 文档,并且修改里边的daxPath变量,即可运行。
本文主要内容是讲在WorkflowSim中如何调用自己设计的调度算法以及想使用代价(Cost)的注意事项。
这部分介绍如何使用自己的工作流调度算法。
首先,来实现一个调度算法。前提是下载好WorkflowSim源码。
具体步骤如下:
(1)写一个继承BasePlanningAlgorithm的Class,类名如DynamicPlanningAlgorithm,重写run()方法。
public class DynamicPlanningAlgorithm extends BasePlanningAlgorithm {
/**
* The main function
* 注意:此方法本应该实现调度算法,此处我并未实现调度算法,仅仅做了vm与task的映射,因为调度算法实现的调度顺序是存储在静态全局数组Parameters.dynameicPlanningVMIdSchuler里的
*/
@Override
public void run() {
int length = Parameters.dynameicPlanningVMIdSchuler.length;
//设置虚拟机调度顺序数组Size与任务Size相同,即一一对应
for(int i = 0; i < getTaskList().size(); i++){
int vmId = 0;
if( i < length){
vmId = Parameters.dynameicPlanningVMIdSchuler[i] - 1;
}
//设置vm与task的映射关系
getTaskList().get(i).setVmId(vmId);
}
}
(2)在WorkflowPlanner里getPlanningAlgorithm()方法里新添加一种调度算法,即步骤(1)所实现的:
/**
* Switch between multiple planners. Based on planner.method
*
* @param name the SCHMethod name
* @return the scheduler that extends BaseScheduler
*/
private BasePlanningAlgorithm getPlanningAlgorithm(PlanningAlgorithm name) {
BasePlanningAlgorithm planner;
// choose which scheduler to use. Make sure you have add related enum in
//Parameters.java
switch (name) {
//by default it is FCFS_SCH
case INVALID:
planner = null;
break;
case RANDOM:
planner = new RandomPlanningAlgorithm();
break;
case HEFT:
planner = new HEFTPlanningAlgorithm();
break;
case DHEFT:
planner = new DHEFTPlanningAlgorithm();
break;
//新添加的调度算法
case DYNAMICPLANNING:
planner = new DynamicPlanningAlgorithm();
break;
default:
planner = null;
break;
}
return planner;
}
(3)在参数类Parameters的枚举PlanningAlgorithm里面添加步骤(2)的case: DYNAMICPLANNING
public enum PlanningAlgorithm{
INVALID, RANDOM, HEFT, DHEFT, DYNAMICPLANNING
}
(4)在任意一个Example里修改两个参数值Parameters.SchedulingAlgorithm、Parameters.PlanningAlgorithm pln_method
/**
* Since we are using MINMIN scheduling algorithm, the planning
* algorithm should be INVALID such that the planner would not
* override the result of the scheduler
*/
Parameters.SchedulingAlgorithm sch_method = Parameters.SchedulingAlgorithm.INVALID;
Parameters.PlanningAlgorithm pln_method = Parameters.PlanningAlgorithm.DYNAMICPLANNING;
(5)这一步骤是我写DynamicPlanningAlgorithm类时缺少具体工作流调度算法实现,这儿任意提供调度顺序,假定是由xx调度算法所实现出来的,并将其赋值给静态全局数组Parameters.dynameicPlanningVMIdSchuler,这个数组有一个约定就是数组长度与任务个数相同,并且dynameicPlanningVMIdSchuler数组中的每个元素值是创建的虚拟机序号(从1开始)。
int vmNum = 20;//number of vms;
/**
* Should change this based on real physical path
*/
//String daxPath = "/Users/weiweich/NetBeansProjects/WorkflowSim-1.0/config/dax/Montage_100.xml";
String daxPath = "D:/workspace/person/WorkflowSim-1.0-master/config/dax/Montage_100.xml";
File daxFile = new File(daxPath);
if (!daxFile.exists()) {
Log.printLine("Warning: Please replace daxPath with the physical path in your working environment!");
return;
}
//构造调度顺序
int vmSchedule[] = new int[100];
for(int i = 0; i < vmSchedule.length; i++) {
vmSchedule[i] = (i + 1) % vmNum;
}
Parameters.dynameicPlanningVMIdSchuler = vmSchedule;
注意dynameicPlanningVMIdSchuler,在参数类Parameters中定义:
/**
* 动态调度时的调度顺序:实际上就是VM的ID集合
*/
public static int []dynameicPlanningVMIdSchuler = null;
在需要获取数据处理代价时需要,可以在仿真结束之后调用Task对象的getProcessingCost(),它是数据传输代价(输入、输出文件)与CPU处理代价之和。其中,数据传输代价与带宽相关,CPU执行代价与mips有关。
需要注意就是:
(1)使用cost时需要在任意一个Example里文件系统设置为LOCAL
//使用cost时需要设置为LOCAL
ReplicaCatalog.FileSystem file_system = ReplicaCatalog.FileSystem.LOCAL;
(2)若是需要使用虚拟机代价模型,在任意一个Example里需要添加下列语句
//默认代价模型是DataCenter,修改为虚拟机,使用数据传输代价时需要设置
Parameters.setCostModel(Parameters.CostModel.VM);
4.参考资料(个人觉得这些也是学习CloudSim与WorkflowSim的一些比较好的博客)
(1)WorkflowSim 大数据工作流仿真软件介绍
(2)CloudSimExample1.java 代码分析——2015.07.17
(3)CloudSim仿真流程研究(一)
(4)cloudsim仿真算法研究之三(完结)
(5)用遗传算法GA改进CloudSim自带的资源调度策略