luigi学习4-构建工作流

时间:2021-06-23 09:58:38

luigi提供了两个基本单元来构造一个工作流,这两个基本单元分别是Task和Target。这两个单元都是抽象类,我们实现他们中的某些方法就可以了。除了这两个基本单元,还有一个重要的概念是Prameter,它可以控制task的运行方式。

一、target

target对应的是磁盘上的一个文件,或者是HDFS上的一个文件,或者数据库中一条记录。一个自定义的target只需要实现exists方法,如果文件存在那么返回true,如果不存在则返回false。

实际上,自定义一个Target类的概率是很小的,luigi提供了很多现成的实现,这些实现足够满足大部分应用的需求。这些实现包括LocalTarget,HdfsTarget。除了这两个常用的文件系统,luigi也提供了对其他文件系统的支持,

比如:luigi.s3.S3Target,luigi.contrib.ssh.RemoteTarget,luigi.contrib.ftp.RemoteTarget,luigi.contrib.mysqldb.MySqlTarget,luigi.contrib.redshift.RedshiftTarget等等。

大多数的target都是和文件系统有点相似的,比如LocalTarget和HdfsTarget都对应在本地或者hdfs上的一个文件。他们不但包装了底层的文件系统的操作,来使得所有的操作都是原子性的,并且他们都实现了open()方法,通过这个方法

传入"mode='r'"来获取读取流,传入"mode='w'"来获取输入流。

luigi也提供了压缩的功能,只需要配置format=format.Gzip就可以,当然添加其他的压缩支持也是很方便的。

二、task

task是做计算的地方。其中有一些方法区实现来改变它的行为,最为显著的方法是run(),output()和requires()。

task通常情况下需要消费其他的task产生的target,并且通常情况下也会生产出(output)一些target。

我们可以通过requires()方法来定义几个task之间的依赖关系。

每一个task通过output方法来定义它的输出。并且可以通过input()方法来得到对应的依赖的target对象。

官网的这个图很明了的显示了input()和output()之间的关系:

luigi学习4-构建工作流

三、parameter

parameter可以向task传递参数。比如你有一个hadoop job每天夜里计算一哥报告,那么你可能需要一个date类型的参数来指明计算日期。

四、dependencies

使用task、target、parameter,luigi允许你使用代码的方式自定义复杂的依赖关系,而不是用配置文件。

这是非常有用的,因为在现实世界里面的依赖关系是很凌乱的。下面的这些依赖关系,你有可能会遇到:

luigi学习4-构建工作流