当我禁用数据存储区写入时,如何启动Mapreduce作业?

时间:2012-08-13 06:41:24

标签: google-app-engine app-engine-ndb

我正在尝试使用Mapreduce库在实时App Engine应用上进行数据存储架构迁移。

我的映射器使用DatastoreKeyInputReader。每个映射操作使用我的旧模式获取旧实体,执行一些数据操作,然后在新模式下写入新实体(使用新的Kind)。我使用NDB以事务方式获取和放置实体,并将事务选项“force_writes”设置为True。

由于应用程序是实时的,我想在迁移期间阻止所有其他数据存储区写入,但映射器的事务写入除外。不幸的是,虽然在禁用写入的应用程序中将force_writes设置为True可以正确运行单个映射操作,但我实际上无法启动Mapreduce作业 - 它会触发CapabilityDisabledError,因为Mapreduce库本身不会在其自己的簿记中使用force_writes的工作。

一个显而易见的黑客可能是在启用写入的情况下启动作业,然后在作业启动后快速禁用它们。但是,这对我来说似乎很危险,特别是因为我的应用程序在正常情况下每秒进行多次写入。此外,一旦作业结束,它可能会中断,除非及时重新启用写入以进行清理。

那么,当我还需要禁用数据存储区写入时,如何启动Mapreduce作业?看起来像mapreduce.yaml最干净的东西是支持作业的force_writes选项......

1 个答案:

答案 0 :(得分:2)

mapreduce进程要运行多长时间?如果它不是一个非常漫长的过程(即不是3天或某事),您可能只想添加一个默认的hanlder,将所有流量路由到您的站点到静态HTML维护页面,然后运行mapreduce作业。一旦完成,您可以在删除默认处理程序的情况下重新部署。