タスクパラメータを設定してみた | Luigi Advent Calendar 2016 #03

2016.12.03

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。
このエントリは『Luigi Advent Calendar 2016』3日目の内容となります。
今回はタスクパラメータを設定していきたいと思います。

先日2日目はVisualStudioCodeを用いてのデバッグ でした。

タスクに対して、抽出日時や抽出条件の制御等のパラメータを設定したいといったケースがあるのは容易に想像できることと思います。
タスクのパラメータとして値を作成することで、タスク実行時に値を設定することが可能です。

設定方法

前回のサンプルではフィボナッチ数列を1000まで計算するといったタスクを作成しました。
これをデフォルト1000までとし、それ以外の値をパラメータで指定できるようにします。

Luigiのタスクでパラメータを設定する際にはクラス変数として宣言をし、その値に対してluigi.Parameter() を代入することで、その変数はパラメータとして扱われます。 よって以下のようになります。

HelloWorld.py

import luigi
import FibonacciNumber


class HelloWorldTask(luigi.Task):
    limit = luigi.IntParameter()
    task_namespace = 'examples'
    m = []

    def run(self):
        f = FibonacciNumber.FibonacciNumber()
        ans = f.calculation(self.limit)
        print list(ans)

このように設定したばあい、Luigiのタスクとして起動した際パラメータの入力を求められることになります。
パラメータを付与した場合、起動オプションに --help とつけて起動することで、付与するパラメータを確認することができます。

$ PYTHONPATH='.' luigi --module  HelloWorld examples.HelloWorldTask --local-s cheduler --help
usage: luigi [--local-scheduler] [--module CORE_MODULE] [--help] [--help-all]
             [--examples.HelloWorldTask-limit EXAMPLES.HELLOWORLDTASK_LIMIT] 
             [--limit LIMIT]                                                 
             [Required root task]                                            

positional arguments:                                                        
  Required root task    Task family to run. Is not optional.                 
                                                                             
optional arguments:                                                          
  --local-scheduler     Use an in-memory central scheduler. Useful for testing.                                             
  --module CORE_MODULE  Used for dynamic loading of modules                  
  --help                Show most common flags and all task-specific flags   
  --help-all            Show all command line flags                          
  --examples.HelloWorldTask-limit EXAMPLES.HELLOWORLDTASK_LIMIT              
  --limit LIMIT

末尾2行をみると設定したパラメータ(limit)に対して値を設定できるようになっていることがわかります。
また、パラメータを設定しなかった場合以下のようになります。

$ PYTHONPATH='.' luigi --module  HelloWorld examples.HelloWorldTask --local-s cheduler                                                                     
ERROR: Uncaught exception in luigi                                           
Traceback (most recent call last):                                           
( 中略)
MissingParameterException: examples.HelloWorldTask[args=(), kwargs={}]: requi res the 'limit' parameter to be set

limitというパラメータがセットされてないといった例外が発生していることがわかります。
パラメータにデフォルト値を設定したい場合は以下のようにすることで設定することが可能です。

HelloWorld.py

import luigi
import FibonacciNumber


class HelloWorldTask(luigi.Task):
    limit = luigi.IntParameter(default=1000)
    task_namespace = 'examples'
    m = []

    def run(self):
        f = FibonacciNumber.FibonacciNumber()
        ans = f.calculation(self.limit)
        print list(ans)

上記の用にすることでパラメータを付与しなくても、パラメータを付与した際と同じ動きをすることになります。

まとめ

タスクパラメータを設定することで、タスクを起動する際にその挙動を制御することができました。
明日はローカルファイルの参照を行います。