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



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

问题:

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

回答您的问题:

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

您遇到的实体似乎没有被删除的问题可能是由多种原因造成的。以下是一些:

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

相关内容

  • 没有找到相关文章

最新更新