1

在我的 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要删除的 s ( is_backup_object = True),其中一些对象没有被删除,即使is_backup_object valueTrue

问题:

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

1 回答 1

4

要回答您的问题:

  1. 是的,我operation.db.Put在自己的 MapReduce 管道中使用,ndb模型很好。
  2. 不,缓存似乎不会干扰数据库操作。
  3. 不,对于db和也是一样的ndb
  4. 这可能是由于最终的一致性。由于您正在使用 MapReduce 迭代您的实体,因此您可能没有使用祖先查询。因此,您不能确定的实体会立即被删除。可能还有其他因素。见下文。
  5. MapReduce 非常适合批处理,因此您走在正确的道路上。

您遇到的似乎没有被删除的实体的问题可能是由于多种原因造成的。这里有几个:

  • 最终的一致性——正如我所提到的——只有当实体后来实际上被删除时,才会出现实体没有被删除。
  • MapReduce 并未触及所有实体。可能是由于 MapReduce 管道开头的过滤器或命名空间错误。
  • 管道中的错误。这应该显示在您的日志中。
  • 奇怪的缓存问题。要确认或取消确认这将需要严格的测试。
于 2013-07-24T13:30:54.280 回答