用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囉.
首先, 先指定一個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囉.
留言