我們是如何刪除 PB 級重複數據的?

2020-12-25 計算機java編程

Mixpanel 通過網絡從移動端、瀏覽器端和伺服器端的客戶接入了千萬億字節的事件數據。由於網絡的不可靠性,客戶可能會不斷重複發送事件請求,直到他們收到來自 Mixpanel 的 200 OK(連接成功)消息。雖然這種重試策略避免了數據丟失,但是在系統中創建了大量的重複事件。對這類重複事件的數據的分析也非常容易產生問題,因為它對所發生的事給出了一個不準確的描述,這也會導致 Mixpanel 偏離其它正在同步的客戶端數據系統,如數據倉庫。這也是為什麼我們非常關心數據完整性的原因。

今天,我們很高興在這裡分享我們的 PB 級規模的事件數據去重解決方案。

要求

為解決這個問題,我們需要一個能夠滿足以下要求的方案:

可擴展性:能夠擴展到百萬事件 / 秒的接入量低成本:為接入、存儲和查詢優化成本 / 性能負載可追溯性:能夠對任意發送的事件進行重複識別可恢復性:保留重複數據從而在配置錯誤時可以回滾可維護性:最小化運營負載最新技術:接入 - 時間去重

業界有很多富有創造性的方法來解決數據去重問題。其核心策略是在接入層構建一個能夠去重的的基礎設施。客戶發送的每個事件都有一個唯一的 insert_id 保存一定期限(例如 7 天),期間將會與每個新事件進行匹對,以查找去重標識。鍵值通常是用存儲的分片的 RocksDB 或 Cassandra。通過使用布隆過濾器來優化存儲中的查找成本。這種架構能夠確保在系統入口點就將重複內容清除。

但是,這種方法並不符合我們的要求,原因如下:

√ 擴展性:分片鍵值存儲可以水平擴展

× 低成本:需要一個單獨的資料庫和基礎設施來保存重複數據

× 可追溯性:只能抓取一定時間段的重複數據

× 可恢復性:抓取時丟棄數據,不能回滾

× 可維護性:刪除重複數據成為一個額外的服務,必須 24x7 不間斷

我們的方案

我們的方案是接入所有事件並在讀取時去重,該方案也滿足了前面所有的要求。每次查詢時,通過構建一個包含所有 $insert_id 的哈希表可以很容易地在讀取時實現去重;但是,這會給我們的系統增加一些額外的開銷。在詳細介紹這個方案之前,讓我們先回顧一下 Mixpanel 架構的幾個關鍵技術。

Mixpanel 架構

基於項目、用戶和時間的分片

Mixpanel 的分析資料庫 Arb 按照項目、用戶和時間對數據文件進行了分片。這可以確保指定用戶的所有數據都可以共同保存在一個位置,查詢時也可以在相關的時間段同時覆蓋多個用戶。

Lambda 架構

在 Arb 中,所有事件都被寫入 AOF(只允許追加的文件),這些文件被周期性地索引(壓縮)到後臺的柱狀文件中。AOF 在達到某個大小或時間閾值時,就會被索引。Arb 通過掃描小型的、實時的 AOF 和大型的、歷史的、索引的文件,從而確保查詢的實時性和高效性。

Mixpanel 架構

我們主要利用架構中的這兩類文件來提高讀時去重的效率。根據第一準則,重複事件具有以下屬性:

重複事件屬於同一項目重複事件項屬於同一用戶重複事件屬於同一事件時間根據這些屬性特徵,我們可以:

在搜索空間中搜索項目、用戶和日期的重複事件,即搜索單個 Arb 碎片。通過與 lambda 架構一起攤銷來最小化去重開銷,從而維護查詢的實時和高效。這幫助我們實現了一個滿足所有要求的解決方案。

數據去重架構

在 Mixpanel 的基礎設施中,在索引和查詢時都可以去重。

Mixpanel 架構

我們的索引器在內存中維護了一個 hashset,該 hashset 通過 $insert_id 保存了被索引文件中的所有事件。如果某個事件命中,則對該事件設置一個索引格式的重複標記位。這個過程的開銷很小,畢竟索引是在細粒度分片級別進行的。

查詢時,由於使用了 lambda 架構,我們可以同時掃描索引文件和 AOF。對於索引文件,我們可以檢查是否設置了重複位,如果設置了,則跳過處理事件。對於那些小的 AOF,查詢可以對 $insert_id 基於散列去重。這可以讓我們既實時又高效,充分發揮了 lambda 架構的優勢。

性能

我們從實驗中發現,當索引含有 2% 重複的文件時會增加 4% 到 10% 的時間開銷。但這並沒有對用戶體驗產生直接影響,因為索引是一個離線過程。

對於查詢時間,我們發現當額外讀取一個事件的標誌位時會增加大約 10ns 的時間。由於增加了額外的列,這使查詢時間增加了近 2%。每讀取 1000 萬個事件會增加約 0.1 秒(100 毫秒)的時間開銷。作為參考,由於採取了基於項目、用戶和時間的分片,Mixpanel 目前最大的柱狀文件包含大約 200 萬個事件。我們認為在時間成本上的損失是完全可以接受的,因為我們在數據的保留期限和運營成本上都獲得了更大的回報。

未來工作

我們的解決方案並不完美,還有以下場景有待改善:事件可能因為分別保存在 AOF 和索引文件而造成重複。我們可以分別在索引文件或 AOF 中識別出重複項,但不能識別出不同文件中的重複。我們之所以選擇忽略這種情況,主要原因如下:

這種情況極其罕見:99.9% 的客戶的數據都非常小,以至於一整天的接入量都可以放入一個 AOF 文件中。這意味著 99.9% 的客戶不會受到這個問題的影響。對於可能遇到此問題的大數據客戶,我們估計一個事件及其重複數據分別保存到兩個文件的機率為 0.5%。我們的系統會在當日結算時自我修復,當天所有的數據都會重新索引到一個文件中。所以重複數據只會在這一天中短暫出現。我們發現,這種方法的優勢大大超過了其弊端。未來,我們會實現不同文件間的實時去重以及最近幾天文件的數據去重。

結語

在文中,我們討論了在索引層分發重複標識和在查詢層分發重複過濾的架構。這個方案已經在 Mixpanel 內部成功運行了 6 個月的時間。

相關焦點

  • MySQL如何刪除重複數據
    MySQL中經常會遇到重複的數據,那麼當我們遇到重複的時候的時候,如果定位哪些數據是有重複的記錄?如何刪除重複的數據?我們該怎麼做呢?接下來我們一步步來分析一下遇到這樣的情況後,該如何處理。>查找要保留的數據上面我們知道該如何查詢哪些數據是重複數據了,那麼我們需要保留的數據是哪些?
  • 如何在Excel中一鍵刪除重複數據
    首先,我們分析下這張表。可以看出,在這張表中,第2行和第21行的數據重複,第16行和第22行的數據重複。下面,我們來看看如何一鍵刪除重複的數據。第一步:點擊數據區域的任意單元格;第二步:點擊上方「數據」菜單欄裡的「刪除重複項」;第三步:出現「刪除重複項」的對話框;這裡,我們要注意兩塊,第一塊是右上角的「數據包含標題」,這裡需根據實際情況選擇,比如今天用的示例表是有標題的,那麼就應該勾選上
  • 利用VBA代碼刪除空白行,如何刪除重複數據
    大家好,今日內容仍是和大家分享VBA編程中常用的簡單「積木」過程代碼,NO.136-NO.138,內容是:插入多行表格的方法、如何刪除工作表中的空白行、刪除重複數據行等內容。VBA過程代碼138:EXCEL中,如何刪除重複數據行Sub mynz()Dim R As IntegerDim i As IntegerWith Sheets("24")
  • 重複數據太多怎麼辦?excel下教你如何刪除重複數據
    我們在使用excel表格時經常會從很多表格匯總數據,因此可能就會產生很多數據重複,如果數據少的話,可以通過直接查看來過濾刪除重複數據,但是如果數據多了再通過人工的方式就很不現實了,也非常容易誤刪,那麼有什麼辦法可以自動按規則刪除重複的數據呢?下面就來介紹一下。這使用的是excel2016版本,其它版本也類似。
  • 完美組合:NetApp重複數據刪除和VMware
    VMware 已成為我們見過的用於 NetApp 重複數據刪除的最受歡迎的使用案例。與 Data ONTAP®7.2.2 一起發布重複數據刪除之後不久,客戶就開始報告在傳統的 VI3 環境和新興的 VDI 環境中對 VMware 虛擬機 (VM) 進行重複數據刪除都獲得了極大成功。自然地,我們想要詳細地了解並研究他們為何如此興奮。
  • 重複數據刪除如何對主存儲進行優化
    主要文件系統存儲優化(也就是在同樣的空間塞進更多的數據)繼續在日益普及。這裡的挑戰是主存儲的重複數據刪除[注]並不是沒有規則的。你不能刪除這個重複的數據,也不能刪除那個重複的數據,你必須要認識到刪除重複數據之後對設備性能的影響。EMC已經宣布了在自己的Celerra平臺上刪除重複數據的功能。
  • Oracle資料庫刪除重複數據的情況!
    【IT168 論壇採風】在對資料庫進行操作過程中我們可能會遇到這種情況,表中的數據可能重複出現,使我們對資料庫的操作過程中帶來很多的不便,那麼怎麼刪除這些重複沒有用的數據呢?
  • 盤點存儲技術:重複數據刪除技術漫談
    重複數據刪除是一種目前主流且非常熱門的存儲技術,可對存儲容量進行有效優化。它通過刪除數據集中重複的數據,只保留其中一份,從而消除冗餘數據。一、重複數據刪除的原理每一個數據塊通過散列算法(例如MD5 或者SHA-1)為每一個數據產生一個特定的散列值。
  • 如何快速刪除表格區域中的重複數據
    在Excel工作表中處理數據時,如果其中的重複項太多,則核對起來相當麻煩。此時我們可以利用刪除重複值功能刪除重複數據。如果要刪除工作表中的重複數據,具體操作方法如下。第1步:打開文件所在位置,在數據區域中選中任意單元格;切換到(數據)選項卡;在(數據工具)組中單擊(刪除重複項)按鈕,如下圖所示。第2步:彈出(刪除重複項)對話框,在(列)列表框中選擇需要進行重複值檢查的列;單擊(確定)按鈕,如下圖所示。
  • 高效刪除Oracle中重複數據的方法
    【IT168 技術文章】       在對資料庫進行操作過程中我們可能會遇到這種情況,表中的數據可能重複出現,使我們對資料庫的操作過程中帶來很多的不便,那麼怎麼刪除這些重複沒有用的數據呢?
  • Data Domain新品提升In-Line重複數據刪除性能
    DoSTOR存儲在線 5月13日國際報導 Data Domain推出全新高端系統並聲稱,該產品大大提升了in-line重複數據刪除的性能。 據Data Domain稱,今天發布的DD690,在單數據流(single stream)備份作業時,刪除重複數據速度達170MB/s。而其之前的DD580系統,該速度為160MB/s。
  • SQL中如何刪除重複數據,只保留其中一行
    ,刪除保留其中一條(是否重複判斷基準為多個欄位)解決方案碰到這樣的問題我們先分解步驟來看創建測試數據找到重複的數據刪除重複的數據並且保留一行創建測試數據我們創建一個人員信息表並在裡面插入一些重複的數據。
  • excel刪除重複數據保留一條
    EXCEL中刪除重複內容只保留一個,可使用數據工具中的「刪除重複項」實現。第一種方法步驟如下:1、打開需要操作的EXCEL表格,選中需要刪除重複內容的數據列,點擊工具欄的「數據」項。2、找到數據工具,點擊「刪除重複項」。3、選擇「全選」,然後點擊下面的確定按鈕即可。4、返回EXCEL表格,可發現已成功刪除重複內容只保留一個。
  • 如何刪除EXCEL中的重複項?
    在資料錄入過程中,有時為了趕時間同時用幾臺電腦進行資料錄入,再將資料導入到同一EXCEL電子表中時,有時會出現不少內容重複現象,在上報資料時又必須刪除重複項,資料量大時單個刪除出來太費事,如何刪除EXCEL中的重複項的快速操作步驟如下:第一步
  • 奇妙的VBA代碼之二十九:EXCEL中,如何快速刪除重複數據行
    各位好,今天開始講VBA代碼解決方案的二十九講:在EXCEL中,如何藉助於代碼來快速完成刪除重複行的工作,其實在實際的工作中這個工作是經常用到的,excel中有沒有重複的數據,是EXCEL數據統計中非常重要的工作的工作之一,也是經常要處理的工作之一。
  • Linux Shell教程 - 如何刪除重複的文本行
    需要對日誌文件中的數據進行排序,但是有太多重複的行。 如何從GNU/Linux下的文本文件中刪除所有重複的行?
  • 解決常見的Windows Server重複數據刪除問題
    如果應用的重複數據刪除出現問題會導致什麼後果?我可以關閉Windows Server重複數據刪除技術麼? 隨著新的應用以及數據密集型文件類型,包括客戶資料庫、電子郵件檔案、PDF文檔以及圖像庫和流媒體文件,存儲需求也大幅增加。數據重複數據刪除技術已成為一項減輕企業存儲要求的強大技術。
  • Excel中刪除重複數據的4種方法分享,快點學習吧
    今天給大家分享的是刪除重複值數據的幾種方法,我們在實際工作中經常會遇到錄入的數據內容重複的現象,那如何實現重複值的快速刪除呢,今天給大家分享4種方法,讓你再遇到類似的情況不再發愁。數據示例如下:方法一、 數據-刪除重複項這種方法是我們經常使用的,操作也很簡單,首先選中需要刪除重複值的數據區域,點擊菜單欄中【數據】-【刪除重複項】即可。可以看到重複的內容已經全部刪除了。
  • excel表格中刪除重複數據保留一條
    excel表格中刪除重複數據只保留一條,看似很麻煩,其實Excel表格自己就提供了最簡單的「去重」功能。只需選中所需去重內容,點擊一下就會將重複數據去掉。以下圖中數據為例:在「數據」中找到「刪除重複項」後,點擊。
  • 刪除數據重複項,Excel中的這3種方法簡單高效
    種種原因造成數據表中的數據存在重複現象, 刪除重複數據是數據清洗的首要任務。今天,就給大家分享3種方法,以幫助大家快速刪除Excel中的重複數據。刪除重複項是 Excel 提供的數據去重功能, 可以快速刪除重複項, 具體操作步驟如下。步驟 01 執行刪除重複值命令。