簡體   English   中英

MongoDB 分片集群寫入的記錄多於插入的記錄

[英]MongoDB sharded cluster writing more records than inserted

我有一個火花 dataframe 大約有 4300 萬條記錄,我正在嘗試將其寫入 Mongo 集合。 當我將它寫入非分片集合時, output記錄與我嘗試插入的記錄相同。 但是當我將相同的數據寫入分片集合(散列)時,記錄數增加了 3 百萬。

有趣的是,即使在我的 spark 工作完成后,記錄的數量仍在不斷波動。 (沒有其他連接)

當我對范圍分片集合執行相同操作時,記錄數是一致的。 (編輯:即使使用范圍分片集群,它也會在一段時間后開始波動)

有人可以幫我理解為什么會這樣嗎? 而且,我正在對我的集合進行分片,因為我每天要寫大約 3000 億條記錄,我想增加我的寫入吞吐量; 所以任何其他建議將不勝感激。

我有 3 個分片,每個分片在 3 個實例上復制

我沒有在 spark mongo 連接器中使用任何其他選項,僅使用ordered=False

編輯:記錄數似乎在幾個小時后以正確的記錄數穩定下來,如果有人能幫助我理解為什么 mongo 表現出這種行為,那就太好了

混淆是集合元數據和邏輯文檔之間的差異,同時正在進行平衡。

最重要的是,如果您需要准確的計數,您應該使用db.collection.countDocuments()

更深層次的解釋:

當 MongoDB 對集合進行分片時,它會將一系列文檔分配給每個分片。 當您插入文檔時,這些范圍通常會不均勻地增長,因此平衡器進程會在必要時將范圍分割成更小的范圍,以保持它們的數據大小大致相同。

它還在分片之間移動這些塊,以便每個分片具有大約相同數量的塊。

將一個塊從一個分片移動到另一個分片的過程涉及復制該范圍內的所有文檔,驗證它們都已寫入新分片,然后從舊分片中刪除它們。 這意味着被移動的文檔將在兩個分片上存在一段時間。

當您通過 mongos 提交查詢時,分片將執行過濾階段以排除塊中尚未完全移動到此分片的文檔,或者在完全移出塊后尚未刪除的文檔。

要使用此過濾器計算文檔,請使用db.collection.countDocuments()

每個 mongod 都為其擁有的每個集合維護元數據,其中包括文檔計數。 這個計數在每次插入時遞增,在每次刪除時遞減。 元數據計數不能從不完整的遷移中排除孤立文檔。

db.collection.stats()返回的文檔計數基於元數據。 這意味着如果平衡器正在遷移任何塊,則兩個分片都將報告已復制但尚未刪除的文檔,因此總計數會更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM