0

這不是一個應用程序引擎問題,儘管我們的應用程序在App-Engine上使用NDB對數據存儲進行Python運行。所以問題是關於在分佈式系統中處理大型數據集的工作。計算非常大且不斷變化的數據集的最佳實踐

我們有一個不斷增長的數據集,我們需要計算對(數量,金額等)的統計數據。我們有一套系統,能夠以不同的方式成功執行此操作,以便在事物發生變化時以事務方式進行維護......但有些情況下,我們希望刪除統計數據並從頭開始重新計算它們,或者運行驗證例程檢查計數/款項,我們一直保持着差異

問題是,一般,什麼是建築統計對非常大的數據集的一些最佳做法,是不斷在分佈式系統中的變化?

比方說,我們啓動了一個大型MapReduce作業,對一百萬個實體上的特定字段進行求和...並且在該作業運行時出現了幾個新實體,其中幾個被刪除,並且其他幾個求和屬性也發生了變化。爲確保這些增加/刪除/更改將其納入整體總和,最出名/已接受/成功的一些方法是什麼?

回答

0

如果你能滿足幾個條件:

  • 跟蹤每個單獨的MapReduce子作業
  • 確定其結果會由事務更新受到影響的個人的MapReduce子作業
  • 確保這些受影響的MapReduce子作業不影響他們的事務更新同時運行(可能是由交易本身來保證?)
  • 確定在事務更新,每個干擾的MapReduce子作業,如果子作業哈s已完成

然後,您可以爲已完成的每個干擾子作業(可能在完成整個大型MapReduce作業完成後應用它們)生成並應用差分統計更新。尚未執行的子作業不需要這樣的差異統計數據,因爲當子作業在其上執行時內容已經被更新。

您可能需要單獨處理的干擾的添加,刪除和平原變化事務的更新。

或者,您可以存儲所有MapReduce子作業的部分結果,跟蹤其中哪些受到事務性更新(如果有),以及在大型Mapreduce作業結束時檢查作業運行時是否發生更新。如果是這樣,只需重新運行受影響的子作業即可獲得更新的部分結果,並將部分結果重新組合爲最終結果。重複,直到最近的部分MapReduce重新運行時沒有更新發生。或多或少的rsync風格複製/移動巨大的活動分區與最小的停機時間。

您甚至可以將來自交易更新的相關影響信息提供給制圖員(稍微聰明一些),讓製圖人員自己評估對潛在受影響地圖的影響並相應地傳播信息以獲取受影響的子作業重新運行,由於更新進來:)

1

我做到這一點的方式是,我沒有查詢到所有實例和運行我的工作在所有的人每次。我有一個單獨的實體組,它處理1個屬性中的這些統計信息。每當我創建/更新一個實例時,我相應地更新這個屬性的值,當我刪除一個實例時,我也會相應地更新這個值。

確保任何更新都會更新統計信息實體組的最佳方法是使用hooks,每次放入或刪除實例時都會自動運行。

希望有所幫助。

+0

是的,我們也這麼做......但是我們必須得到一個堅實的基線才能開始,如果數據集非常大,這可能會有問題。一旦我們建立了基線,我們使用鉤子來跟蹤差異 –

+0

您能否詳述一下,我不確定我在追隨? – Y2H

+0

它聽起來像你在另一組模型中的實體上保存統計信息,並且當更改發生時更新這些統計信息(例如:每次添加/刪除文件時,都會在某處增加/減少計數器)。這很好,除非你有5百萬個文件,並且你需要精確地統計它們,所以你可以設置你的統計。我跟着你嗎? –