mapreduce是否会使数据存储区变异操作与NDB模型兼容

时间:2013-07-19 04:05:58

标签: 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 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作业时,我想要删除许多userobjectis_backup_object = True),并且即使is_backup_object valueTrue,也不会删除其中一些对象operation.db.Put

问题:

  1. mapreduce是否会产生数据存储区变异操作函数operation.db.Delete和{{1}},以便与NDB对象一起使用?
  2. NDB自动缓存是否会干扰所产生对象的删除(或者可能在数据存储区查看器中显示过时的对象)?
  3. 是否有一种特定的方式可以让我们产生与标准数据库对象不同的NDB对象?
  4. 我目睹了这种奇怪的行为还有其他可能的解释吗?
  5. 如果我做错了什么,那么使用mapreduce有效批量处理NDB数据库实体的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

回答你的问题:

  1. 是的,我在自己的MapReduce管道中使用operation.db.Put并且ndb模型没问题。
  2. 不,缓存似乎不会干扰数据库操作。
  3. 不,dbndb是一样的。
  4. 这可能是由于最终的一致性。由于您使用MapReduce迭代实体,因此您可能不使用祖先查询。因此,您无法确定看到一次删除您的实体。可能还有其他因素。见下文。
  5. MapReduce非常适合批量处理,因此您走的是正确的道路。
  6. 您遇到的似乎没有被删除的实体的问题可能是由于多种原因造成的。以下是一些:

    • 最终的一致性 - 正如我所提到的 - 只有在以后实际删除实体时才会删除实体。
    • MapReduce没有触及所有实体。可能是由于MapReduce管道开头的错误过滤器或命名空间造成的。
    • 管道中的错误。这应显示在您的日志中。
    • 奇怪的缓存问题。要确认或取消确认,需要进行严格的测试。