WorkflowSim工具调用自研工作流调度算法

1.介绍

最近因个人需求在研究云平台环境下的工作流调度,但云平台环境安装较为复杂,就需要一套能进行云平台工作流调度的仿真工具,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)的注意事项。

2.如何使用调度算法

这部分介绍如何使用自己的工作流调度算法。

首先,来实现一个调度算法。前提是下载好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;

3.获取处理代价的注意事项

在需要获取数据处理代价时需要,可以在仿真结束之后调用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自带的资源调度策略

你可能感兴趣的:(云计算)