如何在模块中运行appengine mapreduce作业?

时间:2013-09-21 06:10:36

标签: python google-app-engine mapreduce

我一直在审核appengine中的新“Modules API”,并尝试以最苛刻的任务通过dispatch.yaml路由到模块配置更强大的实例的方式组织应用程序。

但是,当尝试在调度程序中配置“ / mapreduce / ”uris时,它们似乎永远不会在正确的模块中运行,它们总是在默认模块中运行。

调度员看起来像这样:

application: simple-sample
dispatch:
  - url: "*/mapreduce/*"
    module: bigger-instance

  - url: "*/_ah/pipeline/*"
    module: bigger-instance

模块被定义为文档状态,默认位于app.yaml,而bigger-instance.yaml中的更大实例包含mapreduce处理程序条目,但到目前为止,每个mapreduce / *进程都在默认处理程序中执行。获取404的日志,因为处理程序在其他地方定义。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

最简单的选择是设置mapreduce管道的target属性。

pipeline = mapreduce.mapreduce_pipeline.MapreducePipeline( ... )
pipeline.with_params(target="version-dot-module")
pipeline.start()

将此target传递给任务队列,并覆盖您遇到的任务队列default routing。如果没有指定模块的匹配版本,则使用模块的默认版本。您可以只指定"version",在这种情况下应用默认模块。指定不存在的模块将以默认模块的默认版本为目标,即使存在匹配的默认模块版本。


还可以为选定的任务队列定义目标,然后将管道路由到该队列。这种方法的局限性在于,路由适用于所有版本的调用代码,但也许在将路由详细信息保留在yaml文件而不是代码库中是有好处的。