Google app engine mapreduce产量数据存储突变操作是否与NDB模型兼容

Google app engine mapreduce产量数据存储突变操作是否与NDB模型兼容,google-app-engine,mapreduce,datastore,app-engine-ndb,mapper,Google App Engine,Mapreduce,Datastore,App Engine Ndb,Mapper,在我的Python AppEngine应用程序中,我有一个ndb类,我正在运行MapReduce作业,以便删除一些不再需要的旧对象 课程安排如下: class UserModel(ndb.Model): is_backup_object = ndb.BooleanProperty(default=False) etc. MapReduce作业如下所示: from mapreduce import operation as op # Note: userobject is an

在我的Python AppEngine应用程序中,我有一个ndb类,我正在运行MapReduce作业,以便删除一些不再需要的旧对象

课程安排如下:

class UserModel(ndb.Model):
    is_backup_object = ndb.BooleanProperty(default=False)
    etc.
MapReduce作业如下所示:

from mapreduce import operation as op
# Note: userobject is an instantiation of UserModel
def mapreduce_update_userobject(userobject):
    # This will remove "backup" userobjects from the database, while leaving
    # "normal" userobjects alone
    if userobject.is_backup_object:
        yield op.db.Delete(userobject)
当我运行MapReduce作业时,我有许多要删除的
userobject
is\u backup\u object=True
),即使
is\u backup\u object值
True
,其中一些对象也不会被删除

问题:

  • mapreduce生成数据存储突变操作函数
    operation.db.Put
    operation.db.Delete
    是否设计用于NDB对象
  • NDB自动缓存是否会干扰删除生成的对象(或者可能会在数据存储查看器中显示过时的对象)
  • 是否有一种特定的方法可以生成不同于标准数据库对象的NDB对象
  • 对于我所目睹的这种奇怪的行为,还有其他可能的解释吗
  • 如果我做的不正确,那么使用mapreduce高效批处理NDB数据库实体的最佳方法是什么
    回答您的问题:

  • 是的,我使用
    operation.db.Put
    在我自己的MapReduce管道中,
    ndb
    模型很好
  • 不,缓存似乎不会干扰数据库操作
  • 不,这与
    db
    ndb
    相同
  • 这可能是由于最终的一致性。由于您使用MapReduce在实体上进行迭代,因此可能没有使用祖先查询。因此,您不能确保立即删除实体。可能还有其他因素。见下文
  • MapReduce非常适合批处理,因此您走上了正确的道路
  • 您遇到的似乎没有被删除的实体的问题可能是由于多种原因造成的。以下是一些:

    • 最终的一致性——正如我所提到的——只有当实体后来被删除时,它们才看起来没有被删除
    • MapReduce未触及所有实体。可能是由于MapReduce管道开头的筛选器或命名空间不正确
    • 管道中的错误。这应该显示在您的日志中
    • 奇怪的缓存问题。要确认或取消确认,需要进行严格的测试

    回答您的问题:

  • 是的,我使用
    operation.db.Put
    在我自己的MapReduce管道中,
    ndb
    模型很好
  • 不,缓存似乎不会干扰数据库操作
  • 不,这与
    db
    ndb
    相同
  • 这可能是由于最终的一致性。由于您使用MapReduce在实体上进行迭代,因此可能没有使用祖先查询。因此,您不能确保立即删除实体。可能还有其他因素。见下文
  • MapReduce非常适合批处理,因此您走上了正确的道路
  • 您遇到的似乎没有被删除的实体的问题可能是由于多种原因造成的。以下是一些:

    • 最终的一致性——正如我所提到的——只有当实体后来被删除时,它们才看起来没有被删除
    • MapReduce未触及所有实体。可能是由于MapReduce管道开头的筛选器或命名空间不正确
    • 管道中的错误。这应该显示在您的日志中
    • 奇怪的缓存问题。要确认或取消确认,需要进行严格的测试