我正在尝试使用 Mapreduce 库在实时 App Engine 应用程序上进行数据存储区架构迁移。
我的映射器使用 DatastoreKeyInputReader。每个映射操作都会使用我的旧模式获取旧实体,执行一些数据操作,然后在新模式下写入新实体(具有新的种类)。我使用 NDB 以事务方式获取和放置实体,并将事务选项“force_writes”设置为 True。
由于应用程序已上线,我想在迁移期间阻止除映射器的事务写入之外的所有其他数据存储写入。不幸的是,虽然在禁用写入的应用程序中将force_writes设置为True的情况下单个映射操作可以正确运行,但我实际上无法启动Mapreduce作业 - 它会触发CapabilityDisabledError,因为Mapreduce库本身在其自己的簿记中不使用force_writes的工作。
一个明显的黑客可能是在启用写入的情况下启 Action 业,然后在作业启动后快速禁用它们。然而,这对我来说似乎相当危险,特别是因为我的应用程序在正常情况下每秒进行多次写入。另外,一旦作业结束,它可能会中断,除非及时重新启用写入以进行清理。
那么,当我还需要禁用数据存储区写入时,如何启动 Mapreduce 作业?似乎最干净的事情是让mapreduce.yaml 支持作业的force_writes 选项...
最佳答案
mapreduce 进程将运行多长时间?如果这不是一个非常长的过程(即不是 3 天或其他),您可能只想添加一个默认处理程序,将所有流量路由到您的站点到静态 HTML 维护页面,然后运行 mapreduce 作业。一旦完成,您就可以重新部署并删除默认处理程序。
关于google-app-engine - 当我禁用数据存储写入时,如何启动 Mapreduce 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11929295/