星期一, 9月 13, 2010

用cron來觸發mapreduce job

GAE + mapreduce雖然好用, 但是老要用它那個簡單的介面來觸發一個job. 不能自動化的每天自動起來做些統計的事, 感覺挺蠢的. 一直在找要怎麼加, 才能在cron.yaml裡觸發. 終於被我試出來了.

首先, 先指定一個url給特定的handler. 最簡單就是在app.yaml把所有link都導到main.py.
app.yaml
- url: .*
  script: main.py

然後在main.py裡加一段
def main():
    application = webapp.WSGIApplication(...
        ('/tasks/summary', SummaryHandler)],
        debug=True)
    util.run_wsgi_app(application)

重點就是這個SummaryHandler.

class SummaryHandler(webapp.RequestHandler):
    def get(self):
        name = 'count'
        handler_spec = 'main.process'
        reader_spec = 'mapreduce.input_readers.DatastoreInputReader'
        reader_parameters = {'entity_kind': 'main.Client'}
        start_map(name, handler_spec, reader_spec, reader_parameters)


當然啦, 前面要from mapreduce.control import start_map, 上面幾個變數, 就是在mapreduce.yaml裡的設定, 改成用程式來傳.

最 加一個cron.yaml, 內容是...
cron:
- description: daily summary job
  url: /tasks/summary
  schedule: every day 06:00
  timezone: Asia/Taipei

這樣每天早上六點, 就會做一次summary囉.

沒有留言: