2

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

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

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

一个明显的技巧可能是在启用写入的情况下启动作业,然后在作业开始后快速禁用它们。但是,这对我来说似乎很冒险,尤其是因为我的应用程序在正常情况下每秒会进行多次写入。另外,一旦作业结束,它可能会中断,除非及时重新启用写入以进行清理。

那么,当我还需要禁用数据存储写入时,如何启动 Mapreduce 作业?似乎最干净的事情是 mapreduce.yaml 支持作业的 force_writes 选项......

4

1 回答 1

2

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

于 2012-09-14T13:12:51.407 回答