一、luigi介绍

luigi是基于python语言的,可帮助建立复杂流式批处理任务管理系统。这些批处理作业典型的有hadoop job,数据库数据的导入与导出,或者是机器学习算法等等。

luigi的github:https://github.com/spotify/luigi

目前已经有一些抽象层次较低的数据处理工具,比如hive,pig,cascading等。luigi并不是要取代他们,而是帮助你管理这些作业,luigi的task可以是一个hive查询,java写的hadoop作业,一个scala写的spark作业或一个python程序等。luigi提供了互相依赖的大量作业的工作流程管理,所以程序员可以把他们的精力放到作业本身。

目前有一些相似的项目比如Oozie和Azkaban。一个重要的区别是luigi并不仅仅为hadoop作业,它可以很方便的扩展其他类型的任务。

二、luigi官网的hello world例子

2.1top Artists例子的目的

这个例子的目的想要集合一些生产数据的流,然后找到前10个artists,并把最终的结果保存到数据库

2.2Aggregate Artist Streams

class AggregateArtists(luigi.Task):
date_interval = luigi.DateIntervalParameter() def output(self):
return luigi.LocalTarget("data/artist_streams_%s.tsv" % self.date_interval) def requires(self):
return [Streams(date) for date in self.date_interval] def run(self):
artist_count = defaultdict(int) for input in self.input():
with input.open('r') as in_file:
for line in in_file:
timestamp, artist, track = line.strip().split()
artist_count[artist] += 1 with self.output().open('w') as out_file:
for artist, count in artist_count.iteritems():
print >> out_file, artist, count

对于这个类的解释:

requires方法:这个方法指定了本task需要的依赖,在这个例子中,AggregateArttists依赖一个Stream作业,Stream作业需要一个日期作为参数。

参数:每一个作业都可以定义一个或者多个参数,这些参数需要定义在类级别。比如上面这个类就有一个参数date_interval

output方法:定义了作业结果的保存地。

run方法:对于普通的task,你需要实现run方法。在run方法中可以是任何东西,可以创建子进程,进行长时间的算术运算等等。对于一些task的子类,你就不需要实现run方法了,比如JobTask要求你实现mapper和reducer方法。

LocalTarget:这是一个内置的类,可以帮助你很容易的读取或者写本地磁盘。并且保证对磁盘的操作是原子性的。

2.3Streams

class Streams(luigi.Task):
date = luigi.DateParameter() def run(self):
with self.output().open('w') as output:
for _ in range(1000):
output.write('{} {} {}\n'.format(
random.randint(0, 999),
random.randint(0, 999),
random.randint(0, 999))) def output(self):
return luigi.LocalTarget(self.date.strftime('data/streams_%Y_%m_%d_faked.tsv'))

这个类没有依赖,最终产生的效果是在本地文件系统上产生一个结果文件。

2.4在本地执行

PYTHONPATH='' luigi --module top_artists AggregateArtists --local-scheduler --date-interval -

执行完成之后,在当前目录下产生了一个data目录,data目录下的内容如下:

(my_python_env)[root@hadoop26 data]# ls
artist_streams_2012-.tsv streams_2012_06_06_faked.tsv streams_2012_06_12_faked.tsv streams_2012_06_18_faked.tsv streams_2012_06_24_faked.tsv streams_2012_06_30_faked.tsv
streams_2012_06_01_faked.tsv streams_2012_06_07_faked.tsv streams_2012_06_13_faked.tsv streams_2012_06_19_faked.tsv streams_2012_06_25_faked.tsv
streams_2012_06_02_faked.tsv streams_2012_06_08_faked.tsv streams_2012_06_14_faked.tsv streams_2012_06_20_faked.tsv streams_2012_06_26_faked.tsv
streams_2012_06_03_faked.tsv streams_2012_06_09_faked.tsv streams_2012_06_15_faked.tsv streams_2012_06_21_faked.tsv streams_2012_06_27_faked.tsv
streams_2012_06_04_faked.tsv streams_2012_06_10_faked.tsv streams_2012_06_16_faked.tsv streams_2012_06_22_faked.tsv streams_2012_06_28_faked.tsv
streams_2012_06_05_faked.tsv streams_2012_06_11_faked.tsv streams_2012_06_17_faked.tsv streams_2012_06_23_faked.tsv streams_2012_06_29_faked.tsv

streams_*:就是stream作业生成的。

artist_*:是AggregateArtists生成的,就一个文件而已

2.5扩展

再次运行上面的执行命令发现并没有执行任何操作,因为所有任务的output已经存在。这意味着luigi的task都是幂等的,也就是说不管执行多少次,作业的输出应该是不变的。

--local-scheduler告诉luigi不要去连接scheduler server。这是不推荐的运行方式,这种方式也就用在测试阶段。

luigi学习1的更多相关文章

  1. luigi学习3-使用luigid

    --local-scheduler的方式只适用于开发调试阶段,当你真正要把程序部署到一个产品时,我们推荐使用luigid服务. 使用luigid服务不但能提供锁服务(防止一个任务被多个进程重复执行), ...

  2. luigi学习9--执行模型

    luigi的执行和触发模型非常简单. 一.luigi的执行模型 当你执行一个luigi的工作流的时候,worker调度所有的task,并且执行task在一个单独的进程中. 这种scheme最大的好处是 ...

  3. luigi学习8--使用中央调度器

    --local-scheduler一般用在开发阶段,这在一个产品中是不建议这样使用的.使用中央调度器有两个目的: 保证两个相同的task不会同时运行两次 提供一个可视化的界面 注意:中央调度器并不会帮 ...

  4. luigi学习7--running from command line

    最简单去运行一个luigi task的方式是通过luigi命令行工具. 示例代码: # my_module.py, available in your sys.path import luigi cl ...

  5. luigi学习6--parameters详解

    parameter就好比是一个task的构造方法.luigi要求你在类的scope上定义parameter. 如下面就是一个定义parameter的例子: class DailyReport(luig ...

  6. luigi学习5-task详解

    task是代码执行的地方.task通过target互相依赖. 下面是一个典型的task的大纲视图. 一.Task.requires requires方法用来指定本task的依赖的其他task对象,依赖 ...

  7. luigi学习4-构建工作流

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

  8. luigi学习-luigi的配置文件

    一.luigi配置文件的加载顺序 /etc/luigi/client.cfg luigi.cfg LUIGI_CONFIG_PATH环境变量 二.配置文件分节 配置文件被分为了多个section,每一 ...

  9. luigi学习2-在hadoop上运行Top Artists

    一.AggregateArtistsHadoop class AggregateArtistsHadoop(luigi.contrib.hadoop.JobTask): date_interval = ...

随机推荐

  1. Date.UTC日期格式

    日期格式 %a: 简短型星期,比如‘Mon’. %A: 完整型星期, 比如‘Monday’. %d: 两位的日期, 从01到31. %e: 数字型日期,从 1 到 31. %b: 简短型月份, 比如  ...

  2. 安装配置opensips

    opensips提供了一个视频教程(这个页面有下载链接,90M),参考教程 wget http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1 ...

  3. ZOJ 3329 【概率DP】

    题意: 给你三个均匀k面筛子. 分别有k1 k2 k3个面,每个面朝上的概率是相等的. 如果第一个筛子出现a第二个筛子出现b第三个筛子出现c那么置零. 否则在当前和加上三个点数之和. 求当前和大于n需 ...

  4. java环境变量完整版

    jdk默认安装 Key: JAVA_HOME(新建) Value: C:\Program Files\Java\jdk1.8.0_25 Key: Path(编辑) Value: %JAVA_HOME% ...

  5. 在eclipse中生成html注释文档

    生成api文档 文档注释/** 1.描述 2.@author 作者 @version 版本 3.@param 参数 @return 返回值的含义 @throws 抛出异常描述 @deprecated ...

  6. c/c++笔记

    string 若要根据字典序比较string类型的大小,只需要用><=就可以啦 例如: string s1="abcz"; string s2="abcd&q ...

  7. linux服务器查看公网IP信息的方法

    最近在解决网络问题时,需要查看本机的出口公网IP信息,所以在网络上搜索和请求运维达人,获得如下两个方法: curl ifconfig.me 在linux系统中输入上述的命令,可以查看到本机连接的公网信 ...

  8. Digest [information value filtering]

    http://oak.cs.ucla.edu/~cho/papers/cho-filter.pdf 最近对评估方法进行研究,这篇paper是一种对IR方法进行总结,不错的角度,也比较全面

  9. .NET本质论(4)应用程序对象HttpApplication

    当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication.  在ASP.NET内部,HttpRuntime管理一个定 ...

  10. CLRS: online maximum (n,k)algorithm

    //the first k elements interviewed and rejected, //for  the latter n-k elements ,if value >max,re ...