在我的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 value
是True
。
问题:
- mapreduce产生数据存储突变操作函数
operation.db.Put
和operation.db.Delete
是否设计用于NDB对象 - NDB自动缓存是否会干扰已生成对象的删除(或者可能在数据存储查看器中显示过时的对象)
- 有没有一种特定的方法可以让我们产生不同于标准数据库对象的NDB对象
- 对于我所目睹的这种奇怪的行为,还有其他可能的解释吗
- 如果我做错了什么,那么用mapreduce有效地批量处理NDB数据库实体的最佳方法是什么
回答您的问题:
- 是的,我在自己的MapReduce管道中使用
operation.db.Put
,ndb
模型也不错 - 不,缓存似乎不会干扰数据库操作
- 不,
db
和ndb
是一样的 - 这可能是由于最终的一致性。由于您使用MapReduce对实体进行迭代,因此可能没有使用祖先查询。因此,您不能确保看到您的实体被立即删除。可能还有其他因素。请参见下文
- MapReduce非常适合批量处理,因此您走在了正确的道路上
您遇到的实体似乎没有被删除的问题可能是由多种原因造成的。以下是一些:
- 最终一致性——正如我所提到的——这样,只有当实体后来被删除时,它们才看起来没有被删除
- MapReduce并没有触及所有实体。可能是由于MapReduce管道开头的筛选器或命名空间不正确
- 管道中存在错误。这应该显示在您的日志中
- 奇怪的缓存问题。要确认或取消确认,需要进行严格的测试