PyCon APAC 2013参加レポート

第3回 Pythonを便利に使うフレームワーク,ライブラリ ~PyConの楽しみ方

この記事を読むのに必要な時間:およそ 5.5 分

PyCon APAC 2013 参加レポートの最終回は,2日目のセッションと会場の雰囲気を中心にお伝えします。

Luigi, The Friendly Pipeline Plumber

2日目の午後一番の英語セッションです。PyCon APAC 2013のスタッフとしても活動するIan Lewisさんから,Luigiという,バッチ処理をパイプラインで書くためのフレームワークに関しての紹介がありました。

セッションは英語でしたが,日本語も流暢なIan Lewisさん

セッションは英語でしたが,日本語も流暢なIan Lewisさん

Luigiとは

LuigiはSpotifyが開発,公開している,バッチ処理をパイプラインで書くためのフレームワークです。fluentdなどから送られてくるログといった,リアルタイムの処理に向いたフレームワークではなく,あくまでバッチ処理を小さな処理に分けるためのフレームワークです。小さな処理に分けることで,テストを行うのが簡単になります。

以下の項目がLuigiのコンセプトとして紹介されていました。

処理の対象
タスクからの入出力
処理の単位(タスク)
1入力から1出力を作るための処理
渡せるパラメータ
タスクがどのように動くか定義するためのパラメータを設定できる

画像

パイプラインで書くときに必ず必要になってくる機能はすべてLuigiが面倒を見てくれます。たとえば,以下のような機能がLuigiには備わっています。

  • パイプラインの途中で失敗した場合のリカバリ
  • アトミックなファイル操作
  • タスク間の依存関係の管理
  • タスク間の入出力の受け渡し
  • Hadoop/HDFSのサポート
  • 複数マシンでの分割実行
  • タスク進行状況の確認画面

Luigiの使い方

Luigiで書いたタスクの例として以下のコードが紹介されました。

class AggregateArtists(luigi.Task):
    date_interval = luigi.DateIntervalParameter()
    some_val = luigi.IntParameter(default=0)

    def requires(self):
        return [Streams(date) for date in self.date_interval]

    def output(self):
        return luigi.LocalTarget("artist_%s.tsv" % 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メソッドでタスクの依存関係,outputメソッドで出力先,runメソッドで処理の実装を書きます。requiresとoutputメソッドの返り値はLuigiで定義されたクラスのインスタンスを返します。ここでは省略されていますが,StreamsクラスもAggregateArtistsクラスと同様に,luigi.Taskクラスを継承したクラスです。

MapReduceを使って実装するには,runメソッドをmapperとreducerに分けて書きます。

def mapper(self, line):
    ts, artist, track = line.strip().split()
    yield artist, 1

def reducer(self, key, values):
    yield key, sum(values)

セッションで紹介されたコードは全てGithubで見ることができます。こちらはここで省略されている全てのコードが確認できるので,参考にしてください。

著者プロフィール

藤原敬弘(ふじわらたかひろ)

FULLER株式会社

1986年生まれ。北海道苫小牧市出身。苫小牧工業高等専門学校卒業。

Fuller, Inc. CTO

Webプログラマ,よく利用する言語はPython。Pythonコミュニティによく出没する。趣味でArduinoやRaspberry Piなどを使って,便利なものを自作する。

twitter:@wutali
github:https://github.com/wutali


川田裕貴(かわたひろたか)

2013年よりPyCon JPの運営チームに参加する。

Python が好きだけれど,普段は Python が使えないもっと低レイヤーな世界にいる人,しかしWeb系な物も書いたりする。 普通の大学生でもある。2011年度IPA未踏IT人材発掘・育成事業 スーパークリエイター。

Twitter:@hktechno
Blog:/var/log/hktechno

コメント

コメントの記入