stacking 算法的基础学习器的选择(大数据之ZStack引擎)
数据中心由多种资源组成,包括物理(如存储、服务器)和虚拟(如虚拟机)。IaaS软件本质上是管理各种资源的状态;例如,创建虚拟机通常会改变存储的状态(在商店上创建新的磁盘)、网络的状态(在网络上设置DHCP/DNS/NAT等)和虚拟状态。机器管理程序(在虚拟机管理程序上创建)一个新的虚拟机。与普通应用程序不同,大多数应用程序管理存储在内存或数据库中的状态。为了反映数据中心的整体状态,IAAS软件必须管理分散在每个设备中的状态,从而导致长的执行路径。IaaS软件任务通常涉及多个设备上的状态改变,在任何步骤都可能发生错误,然后系统处于中间状态,也就是说,一些设备已经改变了状态,有些则没有。例如,当创建虚拟机时,用于配置IaaS软件的VM网络的常规步骤是DHCP DNS SNAT。如果在创建SNAT时发生错误,则先前配置的DHCP和DNS很可能保留在系统中,因为即使在最后没有成功创建虚拟机,它们也已经成功应用。这种不一致的状态通常会导致云层不稳定。
序列工作流是由链式设计模式(链式模式)生成的,具有可预测的执行序列,是ZStad工作流的基础。一个流本质上是一个可以包含子过程和后才可以完成以前所有的流程执行java接口。
公共接口流{
空隙运行(FlowTrigger trigger,地图数据);
空隙回滚(FlowTrigger Trigger,地图数据);
}
在流程界面中,当工作流前进到这个过程(流程)时,将调用Run(FlowTrigger trigger,MAP数据)方法;参数映射数据可以用来从先前的进程(流)获得数据,并将数据传递给后续的进程(流)。当它完成时,进程(流程)调用ToGr.NeXT(引导)工作流(工作流)来执行下一个进程(流程);如果发生错误,进程(流)应该调用TrutGel.Valt(ErrOrror Error)方法来中止执行,并通知工作流(工作流)回滚完成。D流。进程(包括失败的进程本身)调用它们各自的回滚()方法。
在FlowChain接口中建立的过程代表一个完整的工作流。创建FlowChain有两种方法:
1。陈述式
该过程可以在组件的Spring配置文件中配置,并且可以通过向FlowChainBuilder填充进程的类名称的列表来创建流程链。
这是创建包含可重用进程的严重可配置工作流的典型方法。在上面的示例中,该工作流的目的是创建用户VM;所谓的应用VM具有与分布式虚拟机网卡外部基本相同的相同进程,因此设备VM和用户VM进程配置A的单个进程配置。最共享:
注意:在上一张图片中,我们强调了Apple ServestMultLogATeNICFLUE流程为Green,这是创建用户VM和VM应用的工作流步骤的唯一不同地方。
2。程序设计方法
流程链也可以以编程方式创建。当创建工作流是微不足道的,并且该过程是不可重用的时,通常使用此方法。
FuffChin链= FuffChin Buffeld. NeimSimple流链();
链表名称(“测试”);
SeDATA(NeWHASMAP);
Chain.then(NeWFLASH){()
StrugIn NaMeEng= =“FLUT1”;
@重写
Publicvoidrun(FlowTriggertrigger,MaDATA){
*做一些生意*/
Trigger.next();
}
@重写
公共VoIP回滚(FlowTriggertrigger,MaDATA){
/*回滚某物*
Trigger.rollback();
}
“}”然后(NeWFLASH(){)
StrugIn NaMeEng= =“Fuff2”;
@重写
Publicvoidrun(FlowTriggertrigger,MaDATA){
*做一些生意*/
Trigger.next();
}
@重写
公共VoIP回滚(FlowTriggertrigger,MaDATA){
/*回滚某物*
Trigger.rollback();
}
“完成”(NeXFraveNeDebug(){)
@重写
Publicvoidhandle(MaDATA){
*工作流已成功完成*
}
“}”.Nebug(NeXFraveRoWorkter)({)
@重写
Publicvoidhandle(ErrorCodeerrCode,MaDATA){
*工作流失败,错误*//
}
}启动();
上述形式不方便使用,因为在流中,可以使用地图数据来交换数据,并且每个进程必须冗余地调用DATA GET()和DATA PUT()函数。在类似DSL的方式中,流可以通过变量共享数据:
FuffChin链= FuffChin Buffeld.NexSealFuffon链();
链表名称(“测试”);
Chain.then(NexSyfSt流()){()
StReDATA1=“数据可以被定义为类变量”;
{
DATA1=“数据可以在对象初始化器中进行初始化”;
}
@重写
Publicvoidsetup(){
FialStReDATA2= =“数据也可以在方法范围内定义,但它却”;
流(NeXFLUE){()
StrugIn NaMeEng= =“FLUT1”;
@重写
Publicvoidrun(FlowTriggertrigger,MaDATA){
DATA1=“我们可以在这里改变数据”;
STRIGUSEDATA2=DATA2;
*做某事*
Trigger.next();
}
@重写
公共VoIP回滚(FlowTriggertrigger,MaDATA){
*做一些回滚*
Trigger.rollback();
}
(});
流(NealNoRealFraceFuffy)({)
StrugIn NaMeEng= =“Fuff2”;
@重写
Publicvoidrun(FlowTriggertrigger,MaDATA){
** DATA1是我们在流1**中改变的值。
STRIGUSEDATA1=DATA1;
*做某事*
Trigger.next();
}
(});
完成(NeXFruteNoDeLever)({)
@重写
Publicvoidhandle(MaDATA){
*工作流已成功完成*
}
(});
错误(NeXFraveRoWorkter)({)
@重写
Publicvoidhandle(ErrorCodeerrCode,MaDATA){
*工作流失败,错误*//
}
(});
}
}启动();
另外,大数据初学者有什么不懂的可以关注私信【学习】和转发——我刚整理了一份大数据2018最新的0基础入门和进阶教程,无私分享
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。