Alink的批式任务/流式任务本质上是通过触发Flink的ExecutionEnvironment与StreamExecutionEnvironment的execute方法来执行的。为了调用起来更简练、方便,Alink包装了如下两个方法:
在实际使用中,经常需要触发一些小的批式任务,获取执行的结果。Flink的DataSet提供了print方法、collect方法和count方法,Alink的批式组件也提供了相应的方法。这些方法为用户了解中间过程的数据提供了便利,但是其会被多次触发执行,各个任务之间会有许多重复执行部分。尤其当数据量较大时,每个任务的执行时间较长,而重复计算会消耗大量的计算资源。针对这样的问题,Alink引入了Lazy方式,并相应地定义了lazyPrint()、lazyCollect()等方法。
“Lazy”的概念与“Eager”的概念相对,在许多开发语言中都会应用。Lazy方式被称作懒操作或者延迟操作方式,Eager方式被称作急操作或者实时操作方式。Eager方式与Lazy方式的区别在于用户发出数据请求(显示、获取、加载等)时,是立即行动,还是可以慢一些。
对于Alink的批式处理场景,我们在执行任务时,需要看到原始数据、中间数据,以及统计、评估指标等。若每一个任务均采用Eager方式,则每次数据请求都会触发一个Flink任务,而且由于Flink机制的原因,后续的Flink任务还会重复执行前序任务的部分计算。如果采用Lazy方式,则每个任务并不急于显示,可以通过一个Flink任务完成整个流程,在任务结束后,再返回各项数据。从数据的获取速度上看,采用Lazy方式比较慢,且有延迟;但是从整体的计算时间和资源的消耗方面看,采用Lazy方式更优。
Flink提供了三种方法执行批式任务:print、collect和execute。它们都是Eager方式的。比如,运行到print方法,立即会启动Flink任务进行执行,并将结果打印出来。Alink的批式组件(形如***BatchOp)提供了打印的方法;统计和评估类组件提供了collect方法,用户可以立即获取统计和评估结果,这些方法的命名规则为collect+结果名称,比如collectSummary。执行批式组件,可以使用BatchOperator.execute()。
Alink的Lazy方式需要在操作前加上“lazy”前缀,主要有如下两类操作:
下图详细列举了在各个使用场景下对应的方法。