1

在我的Python AppEngine應用程序中,我有一個ndb類,我正在運行MapReduce作業以刪除一些不再需要的舊對象。mapreduce是否產生與NDB模型兼容的數據存儲區變異操作

類如下:

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. 的設計與NDB對象打交道映射縮減產量數據存儲變異操作功能operation.db.Putoperation.db.Delete
  2. NDB自動緩存是否會干擾刪除對象(或者可能在數據存儲查看器中顯示過時的對象)?
  3. 是否有一種特定的方式讓我們產生與標準數據庫對象不同的NDB對象?
  4. 對於我見過的這種奇怪行爲,還有其他可能的解釋嗎?
  5. 如果我做的不正確,那麼使用mapreduce有效批量處理NDB數據庫實體的最佳方法是什麼?

回答

4

回答您的問題:

  1. 是的,我在我自己的MapReduce管道使用operation.db.Putndb機型都是精品。
  2. 不,緩存似乎不會干擾數據庫操作。
  3. 不,這與dbndb相同。
  4. 這可能是由於最終的一致性。由於您使用MapReduce遍歷實體,因此您可能不使用祖先查詢。因此,您不能確定請參見您的實體一次刪除。可能還有其他因素。見下文。
  5. MapReduce非常適合批量處理,因此您處於正確的道路上。

您遇到的問題似乎沒有被刪除,可能是由於多種原因。這裏有一些:

  • 最終一致性 - 正如我所提到的 - 這樣它看起來實體在事後被刪除時不會被刪除。
  • MapReduce沒有觸及所有實體。可能是由於MapReduce管道開頭的錯誤過濾器或名稱空間造成的。
  • 管道中的錯誤。這應該顯示在您的日誌中。
  • 奇怪的緩存問題。要確認或取消確認,需要進行嚴格的測試。
相關問題